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; }
本文介绍了Symbian操作系统中如何通过CleanupStack解决内存分配时可能发生的Leave问题,并展示了具体的代码实现。

1259

被折叠的 条评论
为什么被折叠?



