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.
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.