非CBase类的清除栈支持
From Forum Nokia Wiki
非CBase类的清除栈支持
迄今有关清除的讨论都假定待清除的对象是从CBase派生的,通过调用delete清除。其它类需要由程序员提供显式的清除支持。
清除栈通过CleanupStack::PushL()的两个重载版本支持其它类型的对象。你可以压入(push):
- 一个TAny*: 这种对象通过对压入的指针调用User::Free()而被销毁。——注意这个不是那么强大: 简单释放内存,没有调用C++析构函数。
- 一个TCleanupItem: 这种类型的对象包装了一个待压入对象的指针,以及提供清除那个对象的函数的指针。
SDK已提供了一些工具函数使构造一个适当的TCleanupItem变得容易。
例子: RPointerArray
RPointerArray 可以被压入清除栈并被安全销毁,通过给它制作一个TCleanupItem和一个静态函数。 在本例中,数组含有HBufC描述符。
// static cleanup function static void PointerArrayCleanup( TAny* aArray ) { static_cast<RPointerArray<HBufC>*>( aArray )->ResetAndDestroy(); } RPointerArray<HBufC> array; ... TCleanupItem arrayCleanup( PointerArrayCleanup, &array ); CleanupStack::PushL( arrayCleanup ); ... CleanupStack::PopAndDestroy(); // arrayCleanup
