清除棧是Symbian OS中的一個基本組成部分,作用是用來處理在異常退出發(fā)生時泄漏的內(nèi)存。
因為Symbian OS不采用標(biāo)準(zhǔn)C++的異常處理(原因是:1、Symbian設(shè)計時,標(biāo)準(zhǔn)C++異常處理還沒有。2、標(biāo)準(zhǔn)C++異常處理耗費資源多,Symbian為硬件要求較低的設(shè)備設(shè)計。)
所以Symbian OS采用異常退出的方式進行處理。
清除棧分為三種:
1、CleanupStack::PushL(CBase* aPtr)
通常用CleanupStack::Pop(CBase* aPtr)來配對使用。應(yīng)用于對象還需要繼續(xù)使用。
如果需要析放,使用CleanupStack::PopAndDestroy(CBase* aPtr)或者CleanupStack::PopAndDestory(UInt iCount)來析放。
主要用來清除從CBase繼承下來的C類對象。
2、CleanupStack::PushL(TAny*),CleanupStack::PushL(TCleanItem)
用于非CBase繼承的類,主要針對M類,沒有析構(gòu)函數(shù)。需要另外定義清除函數(shù)。Sysbian OS提供了3個工具函數(shù)對應(yīng)于3個清除方法:Release()、Delete()和Close()。
CleanupReleasePushL(T& aRef),異常退出的處理或PopAndDestory()調(diào)用將對T類對象調(diào)用Release()來釋放對應(yīng)的資源。
CleanupClosePushL(T& aRef),異常退出的處理或PopAndDestory()調(diào)用將對T類對象調(diào)用Close()來釋放對應(yīng)的資源。
3、CleanDeletePushL()
用于非CBase繼承的類,有析構(gòu)函數(shù),異常退出的處理或PopAndDestory()調(diào)用將對類的析構(gòu)函數(shù)來釋放對應(yīng)的資源
注意:
1、對一個對象,清除永遠不應(yīng)超過一次。
2、永遠不要將類成員變量壓入清除棧。
3、如果對象壓入清除棧,函數(shù)返回時還保留在清除棧,該函數(shù)應(yīng)以“C”作為后綴。