Symbian 清除栈 CleanupStack
2010-06-03 23:05:00 来源:WEB开发网一、为什么使用清除栈
清除栈主要是用来处理在异常退出发生时那些或许可以称之为被遗弃或泄漏的内存。
看下面的代码:
void UnsafeFunctionL()
{
CClanger* clanger = new(ELeave) CClanger();
clanger->InitializeL();
……..//略去
delete clanger;
}
分析:一旦clanger->InitializeL()运行时发生异常,则clanger所指的堆内存将会泄漏,这个例子我们在三步曲之一中提到过。
那么有什么办法来处理这种潜在的错误呢?
我们很容易就想到,可以使用TRAPD捕获异常来进行堆内存的释放,即将上面代码进行如下修改:
void UnsafeFunctionL()
{
CClanger* clanger = new(ELeave) CClanger();
TRAPD(error,clanger->InitializeL());
If(KErrNone != error)
{
delete clanger;
}
……..//略去
delete clanger;
}
也就是说通过TRAPD捕获异常,然后对异常错误码进行判断,如果确实发生异常了,那么就调用delete来释放堆内存。
当然,上面办法是可行的,但是,如果存在多个可能异常的函数,那么我们都使用TRAPD捕获异常的话,所造成的系统开销就会非常之大,清除栈就是为了解决这个问题而存在的,并且它很好的解决了这样类型的一系列问题。
二、使用清除栈
类CleanupStack定义在头文件e32base.h中,可以通过这个类提供的静态成员函数来访问清除栈。
清除栈的原理:
在调用可能发生异常退出的代码之前,非异常退出安全的对象应该被置于清除栈上,这可以保证在异常退出发生时,这些对象可以被正确的销毁。当发生异常退出时,清除栈能够将所有已经置于其上的对象回收。
下面就是一个使用清除栈的小例子:
void SafeFunctionL()
{
CClanger* clanger = new(ELeave) CClanger;
CleanupStack::PushL(clanger);
clanger->InitializeL();
clanger->DoSomethingElseL();
CleanupStack::Pop(clanger);
delete clanger;
}
实际上这个函数中的最后两条语句
Tags:Symbian 清除 CleanupStack
编辑录入:coldstar [复制链接] [打 印]更多精彩
赞助商链接