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.