Symbian CleanupStack

来源:互联网 发布:mac图片 预览 全屏 编辑:程序博客网 时间:2024/05/16 02:28

CMyClass* CMyClass::NewL(TInt aBufSize)

{

CMyClass* self = new (ELeave) CMyClass;

self->ConstructL(aBufSize);

return self;

}

 

上面这段代码的问题是,如果ConstructL()这个函数Leave了,那么self指针指向的内存空间就没有办法回收了。因为这时返回的self的值是0,也即NULL。为了解决类似这样的问题,我们引入Cleanup stack的概念。我们的想法是,对于那些需要分配内存,但有可能发生leave的局部对象,先将它放到Cleanup stack上,如果真的发生了leave的话,Cleanup stack上面的对象会被自动删除,这样就解决了上面的问题。但同时又引起了另外一个问题:如果没有发生leave呢?如果我们一直往Cleanup stack上放对象,但一直都没有leave发生,因而没有对象被删除,那我们的栈岂不是越压越深,直到溢出?为了更完美的解决上面所有的问题,Symbian操作系统要求开发人员压栈之后必须保证出栈,否则将报错。

 

所以修改后的代码是:

CMyClass* CMyClass::NewL(TInt aBufSize)

{

CMyClass* self = new (ELeave) CMyClass;

CleanupStack::PushL(self);

self->ConstructL(aBufSize);

CleanupStack::Pop(self);

return self;

}