WEB开发网
开发学院手机开发Symbian 开发 Symbian C++ 的 NewL ConstructL NewLC ELeave 阅读

Symbian C++ 的 NewL ConstructL NewLC ELeave

 2010-08-11 12:14:00 来源:WEB开发网   
核心提示:初学Symbian开发,第一件感觉迷惑的事情是CleanupStack 第二件肯定是随处可见的NewL,Symbian C++ 的 NewL ConstructL NewLC ELeave,NewLC,ConstructL,如果是频繁使用实在是太麻烦了,于是Symbian的设计者又作了一个规定,这些函数的出现依然和内存

初学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();

1 2 3  下一页

Tags:Symbian NewL ConstructL

编辑录入:coldstar [复制链接] [打 印]
赞助商链接