This example code shows cleanup for a TAny*, in this case a TText.
TText* buffer=(TText*) User::Alloc(100*sizeof(TText)); // create a buffer CleanupStack::PushL(buffer); // push it to the cleanup stack: treated as TAny* TPtr8 bufferPtr(buffer,100); // create a pointer to the buffer ... // use the buffer useBufferL(bufferPtr); ... // destroy the buffer on the cleanup stack CleanupStack::PopAndDestroy();
This example code shows how to provide cleanup stack support for an R class. To do this, a TCleanupItem object must be constructed with a pointer to the object to clean up, and a pointer to a function that provides cleanup for that object. The most effective way to do this is to define a TCleanupItem cast operator in the class.
// TCleanupItem operator for objects of this class RExampleClass::operator TCleanupItem() { return TCleanupItem(Cleanup,this); }
...
// cleanup function for use by cleanup stack static void RExampleClass::Cleanup(TAny *aPtr) { // Invoke the Close member on the RExampleClass at aPtr testConsole.Printf(_L("Doing cleanup.\n")); (static_cast<RExampleClass*>(aPtr))->Close(); } // Show use void DoTheExampleL() { RExampleClass r; r.Open(); // Because RExampleClass has an operator TCleanupItem() // pushing it is OK CleanupStack::PushL(r); // ...use r // possibly some operations that leave // PopAndDestroy() invokes RExampleClass::Cleanup() CleanupStack::PopAndDestroy(); }
Notes
The operator returns a TCleanupItem object which is constructed from a pointer to the static member function which performs the class’s cleanup processing, and a pointer to the object to be cleaned up.
The static member function which provides the class’s cleanup processing must cast the TAny* pointer into a pointer of the class to be cleaned up. This allows the class member function to perform the cleanup
CleanupStack::PopAndDestroy() removes the item from the cleanupstack and invokes the cleanup function defined in the TCleanupItem object.
Remember that the TCleanupItem does not go onto the cleanupstack. the TCleanupItem is a container for the object that goes onto the cleanupstack. In this example, a pointer to the RExampleClass is put on the cleanupstack.