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.