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

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

ID:52423043

大小:350.50 KB

页数:19页

时间:2020-04-06

两阶段构造和对象销毁.ppt_第1页
两阶段构造和对象销毁.ppt_第2页
两阶段构造和对象销毁.ppt_第3页
两阶段构造和对象销毁.ppt_第4页
两阶段构造和对象销毁.ppt_第5页
资源描述:

《两阶段构造和对象销毁.ppt》由会员上传分享,免费在线阅读,更多相关内容在PPT专区-天天文库

1、两阶段构造和对象销毁引言SymbianOS被设计成可以在具有有限内存的设备上很好工作使用内存管理模型,例如清除栈确保内存不会泄漏,甚至出错和异常发生时,例如没有足够内存来完成一次分配两阶段构造是一种在SymbianOS代码中广泛使用的模式,它提供了一种使基于堆的对能够象完全构造和初始化的方法,即使是初始化代码可能异常退出2两阶段构造和对象销毁两阶段构造了解为什么代码不应当在构造函数内部异常退出明白两阶段构造用来避免意外创建未定义状态的对象了解构造函数和第二阶段构造函数ConstructL()的访问说明符在使用两阶段构造的类中被设置为private或者protected,以防止无意中使用理

2、解如何实现两阶段构造,以及如何构造一个从使用了两阶段构造的基类派生的类知道SymbianOS中使用两阶段构造的典型类型(Cclasses)3C++构造函数中的代码不应异常退出考虑例子:classCFoo:publicCBase{...//为清晰起见省略了细节public:CFoo(TIntaVal)     {     iVal=aVal;iBar=new(ELeave)CBar(aVal);}private:CBar*iBar;};...CFoo*foo=new(ELeave)CFoo(42);分配内存给foo并且调用其构造函数但是如果CFoo构造函数中iBar=new(ELeave)

3、CBar(aVal);异常退出了怎么办?CFoo对象已经分配到了内存由于构造时出现了异常退出,因此不会有一个合法的指针指向这个只是部分构造的CFoo对象;没有合法指针就无法清除该CFoo对象4两阶段构造两阶段构造将对象构造分成两个部分不会异常退出的基本C++构造函数该构造函数将被new操作符调用它将隐式调用基类的构造函数它也可以调用不会异常退出的函数,和/或以缺省值或传入构造函数的参数对成员变量进行初始化5两阶段构造两阶段构造将对象构造分成两个部分类方法(典型地,调用ConstructL())一旦分配及构造的对象被压入清除栈则调用该方法完成对象的构造,并安全地执行可能异常退出的操作.如果

4、发生了异常退出,清除栈调用析构函数释放所有已经成功分配的资源,并将对象本身申请的内存回收6两阶段构造classCFoo:publicCBase{...//为清晰起见省略了细节public:CFoo(TIntaVal){iVal=aVal;}voidConstructL(){iBar=new(ELeave)CBar(iVal);}private:CBar*iBar;};...CFoo*foo=new(ELeave)CFoo(42);CleanupStack::PushL(foo);foo->ConstructL();CleanupStack::Pop(foo);将构造函数分开,提供一种更加

5、原子化的异常退出处理方法为foo分配内存,并安全地置于清除栈中会异常退出的函数ConstructL被单独调用7引入NewL和NewLC前面的例子会引入编程错误一些调用者可能在实例化对象后忘记调用ConstructL()因为它不是标准C++的要求的构造方式该模式最好由对象自身调用第二阶段构造函数,还是由调用者调用呢?显然简单的构造函数不能调用,因为它又回到了调用一个会异常退出函数的原始问题8引入NewL和NewLCSymbianOS模式将提供了包裹了两阶段构造的静态函数提供一个简单且容易识别的方法在堆中实例化对象.该函数典型的叫NewL()经常也提供NewLC()函数,以使构造的对象遗留在

6、清除栈上(正如前面清除栈一节中所讨论)9引入NewL和NewLCNewL()和NewLC函数是静态的因此调用它们不需要先有一个类的实例不会异常退出的构造函数和第二阶段构造函数ConstructL()已被设置为private调用者只能通过NewL()/NewLC实例化类的对象防止对象被完全构造后重复调用ConstructL()10实现实例NewL()函数根据NewLC()函数实现,而不是用其他方法(它们由于需要在清除栈上额外调用PushL(),效率上有些微降低)注意SymbianOS使用重载操作符new(ELeave),它会在无法分配需要数量的内存空间时发生异常退出意味着调用new(ELe

7、ave)之后不需要检查空指针/*static*/CFoo*CFoo::NewLC(TIntaVal){CFoo*self=new(ELeave)CFoo(aVal);//第一阶段构造CleanupStack::PushL(self);self->ConstructL(aVal);//第二阶段构造returnself;}/*static*/CFoo*CFoo::NewL(TIntaVal){CFoo*self=CFoo::NewLC(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。