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