版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Copyright 2001-2007 Symbian Software Ltd.Symbian OS基础两阶段构造和对象销毁 两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.2引言Symbian OS被设计成可以在具有有限内存的设备上很好工作使用内存管理模型,例如清除栈确保内存不会泄漏,甚至出错和异常发生时,例如没有足够内存来完成一次分配两阶段构造是一种在Symbian OS代码中广泛使用的模式,它提供了一种使基于堆的对能够象完全构造和初始化的方法,即使是初始化代码可能异常退出Symbian OS基础课程目标Sym
2、bian OS基础Copyright 2001-2007 Symbian Software Ltd.3两阶段构造和对象销毁两阶段构造了解为什么代码不应当在构造函数内部异常退出明白两阶段构造用来避免意外创建未定义状态的对象了解构造函数和第二阶段构造函数ConstructL()的访问说明符在使用两阶段构造的类中被设置为private或者protected,以防止无意中使用理解如何实现两阶段构造,以及如何构造一个从使用了两阶段构造的基类派生的类知道Symbian OS中使用两阶段构造的典型类型 (C classes)两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007
3、Symbian Software Ltd.4C+构造函数中的代码不应异常退出考虑例子: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 对象两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.5两阶段构造两阶段构造将对象构造分成两个部分1. 不会异常退出的基本C构造函数该构造函数将被new操作符调用它将隐式调用基类的构造函数它也可以调用不会异常退出的函数,和/或以缺省值或传入构造函数的参数对成员变量进行初始化两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.6两阶段构造两阶段构造将对象构造分成两个部分2
5、. 类方法 (典型地,调用 ConstructL()一旦分配及构造的对象被压入清除栈则调用该方法完成对象的构造,并安全地执行可能异常退出的操作. 如果发生了异常退出,清除栈调用析构函数释放所有已经成功分配的资源,并将对象本身申请的内存回收两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.7两阶段构造class CFoo : public CBase . /为清晰起见省略了细节public: CFoo(TInt aVal)iVal=aVal; void ConstructL() iBar=new(ELeave)CBar(
6、iVal); private: CBar* iBar; ;.CFoo*foo=new(ELeave)CFoo(42);CleanupStack:PushL(foo);foo-ConstructL();CleanupStack:Pop(foo);将构造函数分开,提供一种更加原子化的异常退出处理方法为foo分配内存,并安全地置于清除栈中会异常退出的函数ConstructL 被单独调用两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.8引入 NewL 和NewLC前面的例子会引入编程错误一些调用者可能在实例化对象后忘记调用C
7、onstructL() 因为它不是标准C+ 的要求的构造方式该模式最好由对象自身调用第二阶段构造函数,还是由调用者调用呢?显然简单的构造函数不能调用,因为它又回到了调用一个会异常退出函数的原始问题两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.9引入 NewL 和NewLCSymbian OS 模式 将提供了包裹了两阶段构造的静态函数提供一个简单且容易识别的方法在堆中实例化对象. 该函数典型的叫NewL() 经常也提供NewLC()函数,以使构造的对象遗留在清除栈上 (正如前面清除栈一节中所讨论)两阶段构造和对象销毁
8、Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.10引入 NewL 和 NewLCNewL()和 NewLC 函数是静态的因此调用它们不需要先有一个类的实例不会异常退出的构造函数和第二阶段构造函数 ConstructL()已被设置为 private 调用者只能通过NewL()/NewLC实例化类的对象防止对象被完全构造后重复调用ConstructL()两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.11实现实例NewL()函数根据NewLC()函数实现,而不是
9、用其他方法 (它们由于需要在清除栈上额外调用PushL(),效率上有些微降低) 注意Symbian OS使用重载操作符new(ELeave) ,它会在无法分配需要数量的内存空间时发生异常退出意味着调用new(ELeave) 之后不需要检查空指针/*static*/ CFoo* CFoo:NewLC(TInt aVal) CFoo*self=new(ELeave)CFoo(aVal); / 第一阶段构造 CleanupStack:PushL(self); self-ConstructL(aVal); / 第二阶段构造 return self; /*static*/ CFoo* CFoo:NewL
10、(TInt aVal) CFoo*self=CFoo:NewLC(aVal); CleanupStack:Pop(this); return self; 两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.12从使用两阶段构造的类派生如果某个类将被继承其缺省构造函数应当设置为protected而不是private,这样编译器可以构造派生类C+ 将确保基类中的第一部分构造被优先调用,之后再调用派生类构造函数两阶段构造不是标准C构造的一部分在构造派生类时基类的第二部分不会被自动调用第二部分构造函数ConstructL() 如
11、果不被派生类调用则设置为private,而如果需要被派生类调用则设置为protected- 在你的代码中注释出来两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.13从使用两阶段构造的类派生一个类倾向于保持继承过程中使用两阶段构造的扩展性,典型的模式提供一个保护 (protected) 函数调用 BaseConstructL() 而不是 ConstructL() 派生类 在自己的ConstructL()函数中调用这个方法确保基类对象完全初始化两阶段构造和对象销毁Symbian OS基础Copyright 2001-20
12、07 Symbian Software Ltd.14讨论点:在构造函数中使用PushL类的两阶段构造也可以避免通过在类的C+构造函数的开始位置包含CleanupStack:PushL(this)这与使用ConstructL() 效果一样 (因为 PushL()总能为以后清除操作安全的存储该指针)如果这个类将用作基类任何从它派生的类的构造函数将引发继承体系中每层构造函数调用一个push和pop的负担这样效率更低相对于在自己的NewLC()中只进行一次pop和push对C+最好自动初始化基类,而由开发者在最后派生的类的NewLC()中管理基类的资源分配两阶段构造和对象销毁Symbian OS基础C
13、opyright 2001-2007 Symbian Software Ltd.15两阶段构造和 Symbian OS 类型两阶段构造典型的仅使用在C类中T 类通常不需要复杂的构造代码因为它们不包括基于堆的成员数据R 类通常创建时不需要初始化,而是要求它们的调用者调用Connect() 或者Open()将R类对象与某个特定资源关联起来Symbian OS基础课程目标Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.16两阶段构造和对象销毁对象销毁了解在析构代码中删除指针后还将指针设为空既不高效也不必要理解在提领(dereference)指
14、针之前析构函数必须对其进行检查以防指针为空,但是如果仅是删除指针则不需要检查两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.17对象销毁当实现标准Symbian OS 两阶段构模式时,仔细考虑析构函数代码是重要的析构函数必须编码释放对象拥有的所有资源析构函数可被调用来清除因为第二阶段构造函数ConstructL()发生异常退出而形成的部分构造对象CBase派生对象的内存被确保在第一阶段构造时被置为二进制0销毁函数在空指针上调用delete的是安全的但是 .两阶段构造和对象销毁Symbian OS基础Copyright 2001-2007 Symbian Software Ltd.18对象销毁析构函数代码 不能假设对象完全初始化应当了解,不要调用没有指向合法对象的指针的方法应当知道尽量回收资源通过取消引用不用检查指向它们的句柄或指针是否合法CExample:CExample()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025河南南阳市新野县淯兴水务公司招聘领导小组招聘笔试(第3号)笔试历年参考题库附带答案详解
- 2025江西吉安市新庐陵投资发展有限公司及下属子公司第二批面向社会招聘及笔试历年参考题库附带答案详解
- 2025江西吉安吉水县吉阳产业发展有限公司及下属子公司招聘岗位核销拟入闱及考察人员笔试历年参考题库附带答案详解
- 棉花厂卸花合同范本
- 2026年心理咨询师考试题库300道附参考答案(预热题)
- 2025年医疗用水设备调试合同协议
- 家庭装修监理合同协议
- 杭州买房定金合同范本
- 2025年智联职业测评题库及答案
- 灯具驱动采购合同范本
- 湖北省鄂东南省级示范高中教育教学改革联盟2026届生物高二上期末复习检测试题含解析
- 科睿唯安 2025-年最值得关注的公司:蛋白质降解剂-使针对“不可成药”靶点的精准干预成为可能
- 2026年广东省春季高考模拟数学试卷试题(含答案解析)
- 中孕引产护理查房
- 公交司机服务规范与技能提升培训
- 福建省龙岩市龙岩北附2026届化学高一第一学期期末综合测试试题含解析
- 血透室护理组长竞选
- 2025年国家开放大学《市场调研方法与实践》期末考试参考题库及答案解析
- 水电解制氢设备运行维护手册
- 2025-2026学年部编版八年级数学上册期中考试试卷及答案
- 实验室生物安全评估报告模板
评论
0/150
提交评论