两阶段构造和对象销毁.PPT

上传人:国*** 文档编号:1127495 上传时间:2018-12-11 格式:PPT 页数:19 大小:350.50KB
下载 相关 举报
两阶段构造和对象销毁.PPT_第1页
第1页 / 共19页
两阶段构造和对象销毁.PPT_第2页
第2页 / 共19页
两阶段构造和对象销毁.PPT_第3页
第3页 / 共19页
两阶段构造和对象销毁.PPT_第4页
第4页 / 共19页
两阶段构造和对象销毁.PPT_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、Copyright 2001-2007 Symbian Software Ltd.Symbian OS基础两阶段构造和对象销毁 两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.引言Symbian OS被设计成可以在具有有限内存的设备上很好工作使用内存管理模型,例如清除栈确保内存不会泄漏,甚至出错和异常发生时,例如没有足够内存来完成一次分配两阶段构造是一种在 Symbian OS代码中广泛使用的模式,它提供了一种使基于堆的对能够象完全构造和初始化的方法,即使是初始化代码可能异常退出2Symbian OS基础课程目标Sy

2、mbian OS基础Copyright 2001-2007 Symbian Software Ltd.两阶段构造和对象销毁两阶段构造了解为什么代码不应当在构造函数内部异常退出明白两阶段构造用来避免意外创建未定义状态的对象了解构造函数和第二阶段构造函数 ConstructL()的访问说明符 在使用两阶段构造的类中被设置为 private或者 protected,以防止无意中使用理解如何实现两阶段构造,以及如何构造一个从使用了两阶段构造的基类派生的类知道 Symbian OS中使用两阶段构造的典型类型 (C classes)3两阶段构造和对象销毁Symbian OS基础Copyright 2001

3、-2007 Symbian Software Ltd.C+构造函数中的代码不应异常退出考虑例子:class CFoo : public CBase. /为清晰起见省略了细节public: CFoo(TInt aVal)iVal=aVal;iBar = new(ELeave) CBar(aVal); private:CBar* iBar;.CFoo* foo = new(ELeave) CFoo(42);分配内存给 foo并且调用其构造函数但是如果 CFoo构造函数中 iBar = new(ELeave) CBar(aVal); 异常退出了怎么办?CFoo对象已经分配到了内存由于构造时出现了异常

4、退出 ,因此不会有一个合法的指针指向这个只是部分构造的 CFoo 对象 ;没有合法指针就无法清除该 CFoo 对象4两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.两阶段构造两阶段构造将对象构造分成两个部分不会异常退出的基本 C构造函数该构造函数将被 new操作符调用它将隐式调用基类的构造函数它也可以调用不会异常退出的函数 ,和 /或以缺省值或传入构造函数的参数对成员变量进行初始化5两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.两阶段构造

5、两阶段构造将对象构造分成两个部分类方法 (典型地 ,调用 ConstructL()一旦分配及构造的对象被压入清除栈则调用该方法完成对象的构造 ,并安全地执行可能异常退出的操作 . 如果发生了异常退出,清除栈调用析构函数释放所有已经成功分配的资源,并将对象本身申请的内存回收6两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.两阶段构造class CFoo : public CBase. /为清晰起见省略了细节public: CFoo(TInt aVal)iVal=aVal;void ConstructL() iBar =

6、 new (ELeave) CBar(iVal); private: CBar* iBar;.CFoo* foo = new (ELeave)CFoo(42);CleanupStack:PushL(foo);foo-ConstructL();CleanupStack:Pop(foo);将构造函数分开,提供一种更加原子化的异常退出处理方法为 foo分配内存,并安全地置于清除栈中会异常退出的函数 ConstructL 被单独调用7两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.引入 NewL 和 NewLC前面的例子会引

7、入编程错误一些调用者可能在实例化对象后忘记调用 ConstructL() 因为它不是标准 C+ 的要求的构造方式该模式最好由对象自身调用第二阶段构造函数,还是由调用者调用呢?显然简单的构造函数不能调用,因为它又回到了调用一个会异常退出函数的原始问题8两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.引入 NewL 和 NewLCSymbian OS 模式 将提供了包裹了两阶段构造的静态函数提供一个简单且容易识别的方法在堆中实例化对象 . 该函数典型的叫 NewL() 经常也提供 NewLC()函数,以使构造的对象遗留在清除栈上 (正如前面清除栈一节中所讨论)9两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.引入 NewL 和 NewLCNewL()和 NewLC 函数是静态的因此调用它们不需要先有一个类的实例不会异常退出的构造函数和第二阶段构造函数 ConstructL()已被设置为 private 调用者只能通过 NewL()/NewLC实例化类的 对象防止对象被完全构造后重复调用 ConstructL()10

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。