190 likes | 362 Views
Symbian OS C++ 基础. 主要内容. Symbian 中的资源管理概述 清除栈 异常退出 类的两阶段构造 动态数组. Symbian 中的资源管理概述. 三种资源管理方式 清除栈 异常退出 类的两阶段构造. 清除栈. 清除栈机制 能够减少程序异常带来的内存泄漏. 清除栈. 使用清除栈 使用清除栈的基本步骤: ( 1 )创建对象 ( 2 )把对象指针压栈 ( 3 )使用对象提供的有可能异常退出的函数,也就函数名后缀有“ L” 的 ( 4 )出栈 ( 5 )根据情况决定是否释放对象. 清除栈. 使用清除栈示例
E N D
主要内容 • Symbian 中的资源管理概述 • 清除栈 • 异常退出 • 类的两阶段构造 • 动态数组
Symbian中的资源管理概述 • 三种资源管理方式 • 清除栈 • 异常退出 • 类的两阶段构造
清除栈 • 清除栈机制 • 能够减少程序异常带来的内存泄漏
清除栈 • 使用清除栈 • 使用清除栈的基本步骤: (1)创建对象 (2)把对象指针压栈 (3)使用对象提供的有可能异常退出的函数,也就函数名后缀有“L”的 (4)出栈 (5)根据情况决定是否释放对象
清除栈 • 使用清除栈示例 CMyObject* obj1=new (ELeave) CMyObject; CleanupStack::Push(obj1); obj1->UseL(); CleanupStack::Pop(); delete obj1;
清除栈 • 清除栈的特殊用法 • 用法一 CMyObject* obj1=new (ELeave) CMyObject; CleanupStack::Push(obj1); obj1->UseL(); CleanupStack::PopAndDestroy(); • 用法二 template <class T> void CleanupClosePushL(T& aRef); template <class T> void CleanupReleasePushL(T& aRef); template <class T> void CleanupDeletePushL(T* aPtr);
异常退出函数 • 函数带有后缀“L” class CExam0303NewGuiAppUi : public CAknAppUi { public: void ConstructL(); CExam0303NewGuiAppUi(); virtual ~CExam0303NewGuiAppUi(); private: void HandleCommandL(TInt aCommand); void HandleStatusPaneSizeChange(); CArrayFix<TCoeHelpContext>* HelpContextL() const; private: CExam0303NewGuiAppView* iAppView; };
异常退出 • 在程序中抛出异常 CObject* pObject=new CObject(); if(!pObject) User::Leave(KErrNoMemory); • 抛出异常的方法 static void Leave(TInt aReason); static void LeaveNoMemory(); static TInt LeaveIfError(TInt aReason); static TAny* LeaveIfNull(TAny* aPtr);
异常退出 • 捕获异常的方法 • TRAP • TRAPD • 示例1 void DoStart() { TInt err; TRAPD(err, MainL()); if (err) { ... ... //处理异常 } }
异常退出 • 示例2 void DoStart() { TRAPD(err, MainL()); if (err) { ... ... //处理异常 } }
类的两阶段构造 • 普遍C++类的创建及使用 CMyClass* pMyClass=new CMyClass; char* pName=pMyClass->GetName(); delete pMyClass;
类的两阶段构造 • 两阶段构造的意义 • 第一阶段是安全的 • 第二阶段做复杂的初始化
类的两阶段构造 • 静态方法NewLC和NewL CMySymbianClass* CMySymbianClass::NewLC() { CMySymbianClass* self = new (ELeave)CMySymbianClass(); CleanupStack::PushL(self); self->ConstructL(); return self; } CMySymbianClass* CMySymbianClass::NewL() { CMySymbianClass* self=CMySymbianClass::NewLC(); CleanupStack::Pop(); // self; return self; }
类的两阶段构造 • 二阶段构造函数 Void ConstructL() { *iBuf=HBufC::NewL(1000); }
类的二阶段构造 • Symbian OS C++类的用法 • 用法一: CMySymbianClass* pMyClass = CMySymbianClass::NewLC() pMyClass->UseL(); //使用类对象 UseOtherFunctionL(); … … CleanupStack::PopAndDestroy();
类的二阶段构造 • Symbian OS C++类的用法 • 用法二: CMySymbianClass* pMyClass = CMySymbianClass::NewL() pMyClass->Use (); //使用类对象 UseOtherFunction(); … … delete pMyClass;
类的二阶段构造 • 二阶段类的简化用法 • 类的声明 class CMySymbianClass2 : public CBase { public: CMySymbianClass(); void ConstructL(); ~CMySymbianClass(); public: TInt GetSum(); private: TInt m_nSum; };
类的二阶段构造 • 二阶段类的简化用法 • 类的创建和使用 CMySymbianClass2* pMySymbianClass2 = new (ELeave) CMySymbianClass2; CleanupStack::PushL(pMySymbianClass2); pMySymbianClass2->ConstructL(); CleanupStack::Pop();