Symbian CleanupStack

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

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值