In general, it is recommended that any objects which are accessed only through an automatic pointer are pushed onto the cleanup stack immediately, before being used, and only popped before they must be destroyed.
You can use the single function
CleanupStack::PopAndDestroy()
to both pop the object from the
cleanup stack and destroy it. This operation is the usual thing to do when an
object on the cleanup stack has been finished with.
void doExampleL()
{
// allocate and leave if could not
CExample* myExample = new (ELeave) CExample;
// this cannot leave - no protection needed
myExample->iInt = 5;
// do something that might leave, protected by cleanup stack
CleanupStack::PushL(myExample); // push pointer to stack
myExample->DoSomethingL()); // something that might leave
// pop from cleanup stack, and destroy, in one operation
CleanupStack::PopAndDestroy();
}
Pop()
on its own is nevertheless useful: it is
safe to pop an object from the cleanup stack when you are sure that it will
either be destroyed, or a reference stored to it, before any operations are
performed on it which might leave. This way, an object can never be orphaned
(which is our aim). In the former case, you get pop-and-destroy all in one,
which it is worthwhile for the system to provide. In the latter case, you need
to store a pointer. This is what happens, for instance, in two-phase
construction.