Symbian OS异常三步曲之三:两段构造
来源:互联网 发布:签章软件 编辑:程序博客网 时间:2024/06/07 10:05
http://blog.csdn.net/btooth/archive/2006/09/12/1213383.aspx
Symbian OS异常三步曲之三:两段构造
为了在堆上分配一个CExample对象内存空间,调用该类的构造函数,如果构造函数本身就异常退出了,那么分配给对象的内存和构造函数中已经分配的内存都将泄漏,因此,C++的构造函数绝对不能发生异常。如果,为了初始化一个对象,必须要编写发生异常的代码,例如内存分配或读取可能丢失的文件,损坏了的配置文件等,这时候,就需要使用两段构造了。
一、两段构造的格式:
编写一个类时,将构造代码分为两部分:
1、 一个基本的不会发生异常退出的构造函数
这个构造函数将被new操作符调用,它隐式的调用基类的构造函数,另外还可以调用那些不会发生异常退出的函数,也可以以默认值或传入构造函数的参数来初始化成员变量。
2、 一个类方法(通常称为ConstructL())
只要通过new操作符分配并构造的对象被压入了清除栈,该方法就可以单独调用了,它将继续完成对象的构造过程,这里面可以安全的执行那些可能发生异常退出的操作。即使发生了异常,由于之前已经将对象指针入栈,清除栈可以调用类的析构函数来释放所有已经成功分配的资源,并回收分配给对象本身的内存。
实例:
class CExample : public CBase
{
public:
static CExample* NewL();//静态函数
static CExample* NewLC();//静态函数
~CExample();//析构函数必须public,否则delete不能调用
private:
CExample();//绝对不能异常
ConstructL();//将构造时所有可能异常的代码放在这里
}
为了安全和使用上的方便,往往在类的定义里面添加两个静态的函数NewL()和NewLC(),作用主要是将两段构造关联到一起。
CExample* CExample::NewLC()
{
CExample* me = new(ELeave) CExample();
CleanupStack::PushL(me);
me->ConstrutL();
return me;
}
CExample* CExample::NewL()
{
CExample me = CExample::NewLC();
CleanupStack::Pop(me);
return me;
}
当然,NewL()和NewLC()函数是可以接受参数的,并可以通过参数来初始化对象。这些参数可以传递给简单构造函数,也可以传递给ContructL(),或者同时传递给两者。
二、使用须知:
如果你的类派生自某基类,而该基类也实现了ConstructL(),那么就要保证当对象被构造时,如果需要,基类的ConstructL()也会被调用(C++能够保证基类第一段简单构造函数会被构造函数自动调用),因此,需要我们自己在ConstructL()中显式的(通过域操作符)调用所有基类的ConstructL(),这样才能保证在初始化派生类对象之前,基类子对象都已经被完全构造了。
- Symbian OS异常三步曲之三:两段构造
- Symbian OS异常三步曲之三:两段构造
- Symbian OS异常三步曲之三:两段构造
- SymbianOS异常三步曲之三:两段构造
- SymbianOS异常三步曲之三:两段构造
- SymbianOS异常三步曲之三:两段构造
- Symbian OS异常三步曲之一:异常退出
- Symbian os 异常处理之TRAP ,TRAPD
- Symbian OS 文件服务器(三)
- Symbian OS异常三步曲之一:异常退出(leave)
- Symbian OS异常三步曲之一:异常退出(leave)zz
- 异常退出(Leave) Symbian OS的异常
- Symbian学习--内存管理、清除栈、两阶段构造、异常退出
- Symbian异常三步曲之二清除栈
- Symbian异常三步曲之二清除栈
- Symbian异常三步曲之二清除栈
- Symbian OS 之活动对象
- Symbian OS 之活动对象
- 我的相册
- Symbian OS异常三步曲之一:异常退出(leave)zz
- 中国程序员为什么应读“名著”
- Symbian异常三步曲之二清除栈zz
- 有一种爱是不能被猜疑的
- Symbian OS异常三步曲之三:两段构造
- Oracle REF CURSOR 使用方法
- 在你的solution里面到底有多少projects? 小型软件公司如何更快的建立自己的Framework.
- SQL server 与oracle 函数对比 [ 来自:csdn ]
- Symbian中的String和Descriptors(zt)
- 主题 VC++的链接错误LNK2001(ZT)
- Observer模式应用 ---文件改变监视器
- ASP.NET 2.0中合并 GridView 的表头单元格
- Symbian内存管理的二十二条军规zz