Symbian 清除栈 CleanupStack
2010-06-03 23:05:00 来源:WEB开发网CleanupStack::Pop(clanger);
delete clanger;
可以使用CleanupStack::PopAndDestroy(clanger);这一条语句来替代,它们是等价的。
如果在调用clanger->InitializeL();或clanger->DoSomethingElseL();的时候异常退出了,clanger对象就会被清除栈销毁。
comments:只有当你的调用可能(只要有可能)会导致异常退出,你就必须把它弄到清除栈上去,否则的话(也就是你能相当确认后续的操作不会导致异常发生),完全没有必要,而且如果你这样做的话也是浪费系统资源,清除栈上放一个指针虽然只有4个字节,但也是肉啊!
顺序问题:
对象必须以严格的顺序压入和弹出清除栈,一组Pop()操作必须与PushL()调用的顺序相反。可能会发生调用Pop()或PopAndDestroy()弹出对象而没有命名这些对象的情况,但最好还是要对弹出对象进行命名。
举例:
void ContrivedExampleL()
{
CSiamese* sealPoint = NewL(ESeal);
CleanupStack::PushL(sealPoint);
CSiamese* chocolatePoint = NewL(EChocolate);
CleanupStack::PushL(chocolatePoint);
CSiamese* violetPoint = NewL(EViolet);
CleanupStack::PushL(violetPoint);
CSiamese* bluePoint = NewL(EBlue);
CleanupStack::PushL(bluePoint);
sealPoint->CatchMouseL();//入清除栈语句放在可能异常退出的代码之前
CleanupStack::PopAndDestroy(bluePoint);
CleanupStack::PopAndDestroy(violetPoint);
CleanupStack::PopAndDestroy(chocolatetPoint);
CleanupStack::PopAndDestroy(sealPoint);
}
可以看到出栈的顺序和入栈的顺序正好是相反的,不过在这里显得复杂了一点,上面的四个出清除栈语句可以使用 CleanupStack::PopAndDestroy(4);或 CleanupStack::PopAndDestroy(4,sealPoint);进行代替效果基本是一样的。
comments:清除栈,清除栈,也是一个栈啊,栈的操作就是先进后出,所以,最后push到栈上的要先pop出来,先push的最后出来,很简单吧!
创建在堆上的对象由谁销毁?
对于一个对象,清除永远不能超过一次。如果清除栈上有一个指向对象的指针,而后来又保存到其它地方了,譬如成了另一个对象的成员变量,而这个对象在异常退出后仍可以被访问,那么就应该从清除栈上弹出这个指针。如果在清除栈上保留了这个指针,那么清除栈会销毁它所指的对象,但是保存了该指针的对象也会试图通过析构函数销毁这个指针所指的对象。
Tags:Symbian 清除 CleanupStack
编辑录入:coldstar [复制链接] [打 印]更多精彩
赞助商链接