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