1 / 19

Symbian OS C++ 基础

Symbian OS C++ 基础. 主要内容. Symbian 中的资源管理概述 清除栈 异常退出 类的两阶段构造 动态数组. Symbian 中的资源管理概述. 三种资源管理方式 清除栈 异常退出 类的两阶段构造. 清除栈. 清除栈机制 能够减少程序异常带来的内存泄漏. 清除栈. 使用清除栈 使用清除栈的基本步骤: ( 1 )创建对象 ( 2 )把对象指针压栈 ( 3 )使用对象提供的有可能异常退出的函数,也就函数名后缀有“ L” 的 ( 4 )出栈 ( 5 )根据情况决定是否释放对象. 清除栈. 使用清除栈示例

garan
Download Presentation

Symbian OS C++ 基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Symbian OS C++基础

  2. 主要内容 • Symbian 中的资源管理概述 • 清除栈 • 异常退出 • 类的两阶段构造 • 动态数组

  3. Symbian中的资源管理概述 • 三种资源管理方式 • 清除栈 • 异常退出 • 类的两阶段构造

  4. 清除栈 • 清除栈机制 • 能够减少程序异常带来的内存泄漏

  5. 清除栈 • 使用清除栈 • 使用清除栈的基本步骤: (1)创建对象 (2)把对象指针压栈 (3)使用对象提供的有可能异常退出的函数,也就函数名后缀有“L”的 (4)出栈 (5)根据情况决定是否释放对象

  6. 清除栈 • 使用清除栈示例 CMyObject* obj1=new (ELeave) CMyObject; CleanupStack::Push(obj1); obj1->UseL(); CleanupStack::Pop(); delete obj1;

  7. 清除栈 • 清除栈的特殊用法 • 用法一 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);

  8. 异常退出函数 • 函数带有后缀“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; };

  9. 异常退出 • 在程序中抛出异常 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);

  10. 异常退出 • 捕获异常的方法 • TRAP • TRAPD • 示例1 void DoStart() { TInt err; TRAPD(err, MainL()); if (err) { ... ... //处理异常 } }

  11. 异常退出 • 示例2 void DoStart() { TRAPD(err, MainL()); if (err) { ... ... //处理异常 } }

  12. 类的两阶段构造 • 普遍C++类的创建及使用 CMyClass* pMyClass=new CMyClass; char* pName=pMyClass->GetName(); delete pMyClass;

  13. 类的两阶段构造 • 两阶段构造的意义 • 第一阶段是安全的 • 第二阶段做复杂的初始化

  14. 类的两阶段构造 • 静态方法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; }

  15. 类的两阶段构造 • 二阶段构造函数 Void ConstructL() { *iBuf=HBufC::NewL(1000); }

  16. 类的二阶段构造 • Symbian OS C++类的用法 • 用法一: CMySymbianClass* pMyClass = CMySymbianClass::NewLC() pMyClass->UseL(); //使用类对象 UseOtherFunctionL(); … … CleanupStack::PopAndDestroy();

  17. 类的二阶段构造 • Symbian OS C++类的用法 • 用法二: CMySymbianClass* pMyClass = CMySymbianClass::NewL() pMyClass->Use (); //使用类对象 UseOtherFunction(); … … delete pMyClass;

  18. 类的二阶段构造 • 二阶段类的简化用法 • 类的声明 class CMySymbianClass2 : public CBase { public: CMySymbianClass(); void ConstructL(); ~CMySymbianClass(); public: TInt GetSum(); private: TInt m_nSum; };

  19. 类的二阶段构造 • 二阶段类的简化用法 • 类的创建和使用 CMySymbianClass2* pMySymbianClass2 = new (ELeave) CMySymbianClass2; CleanupStack::PushL(pMySymbianClass2); pMySymbianClass2->ConstructL(); CleanupStack::Pop();

More Related