Symbian C++ 的 NewL ConstructL NewLC ELeave
2010-08-11 12:14:00 来源:WEB开发网初学Symbian开发,第一件感觉迷惑的事情是CleanupStack 第二件肯定是随处可见的NewL,NewLC,ConstructL。这些函数的出现依然和内存泄漏有关,这是一种被称为两步构造的机制,英文叫Two-phase Construction。
我知道C++里面的 new 操作符实际上完成2件事,第一根据对象类的大小在堆上分配一块内存并获得指向内存的指针,第二利用指针调用类的构造函数,最后把指针返回。在 Symbian上这样做是有隐患的,就是当你分配好了内存,但是调用构造函数的时候程序意外退出了,这样会造成刚才分配的内存产生泄漏。只有那些放入 CleanupStack的内存,在程序意外结束后会被释放,new 分配的内存在调用构造函数之前还没有被放入CleanupStack呢。(这是原理)
Symbian的设计师为了解决这个问题,给所有开发者设计了一个编写程序的定式,这就是Two-phase Construction。
具体是这样的:
把普通的new 操作分为2个步骤来进行,第一步只分配内存,当分配的内存被放入cleanupstack后,第二步进行构造。但是在C++里如何阻止编译器的new操作不调用构造函数呢?这个貌似不可以。。。于是Symbian的设计者作了个规定,类在构造函数里不要做任何可能产生异常的操作,只能做那些绝对安全的事情,比如简单的变量赋值,然后提供一个名字叫 ConstructL的函数,在这个函数里做所有类的初始化工作,当然包括那些危险的可能导致异常的操作。
那么Symbian的 类构造就变成了这样,比如有一个叫CFoo 的类,我想声明一个指针p,创建一个CFoo的对象赋给p。
CFoo *p = new(ELeave) CFoo();
CleanupStack::PushL(p);
p->ConstructL();
CleanupStack::Pop();
这样写是不是有点太罗嗦?每个对象都要用4条语句创建,如果是频繁使用实在是太麻烦了。于是Symbian的设计者又作了一个规定,每个类要实现一个NewL的static函数来完成上面的4条语句的工作
class CFoo
{
public:
static CFoo *NewL()
{
CFoo *self = new(ELeave) CFoo();
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop();
return self;
}
}
有了NewL以后,调用CFoo的类的程序简化了
CFoo *p = CFoo::NewL();
Tags:Symbian NewL ConstructL
编辑录入:coldstar [复制链接] [打 印]更多精彩
赞助商链接