EPOC's clean up strategy is closely tied to its general class
types, particularly classes derived from CBase
.
EPOC does not use standard C++ exceptions (try
,
catch()
blocks), but supplies its own idioms. An exception is
referred to as a leave.
The trap harness defines a point in code that will
be immediately jumped to if a leave occurs. The trap harness is set using the
TRAP
and TRAPD
macros.
Leaves are raised through calling functions provided by the
System Static Functions API User
class, principally
User::Leave()
. Many system functions can result in leaves.
Leaves may also be raised in user code.
If a leave occurs, any heap allocated resources, such as objects
created through new()
, referred to only through automatic pointer
variables will be orphaned on the heap, causing a memory leak. To prevent such
leaks, it is necessary for the program to record any such objects, so that, on
the event of a leave, the system can automatically find and clean them up. The
cleanup stack is the means by which this is done.
The cleanup stack is provided by
CleanupStack
.
GUI applications have a cleanup stack supplied to them by the
application framework. Other applications must explicitly create a cleanup
stack using CTrapCleanup
.
By default, the cleanup stack only handles
CBase
-based classes, and untyped (TAny*
)
objects that can be cleaned up by a simple memory free call. The general
cleanup item allows other types of object to put on the cleanup stack, by
making the caller specify a function that is to be called to perform cleanup on
the object.
The general cleanup item interface is provided by
TCleanupItem
.
Template functions are provided as shortcuts to constructing a
TCleanupItem
and pushing it onto the cleanup stack. These
functions are template <class T> void
CleanupDeletePushL(T*)
, template <class T> void
CleanupClosePushL(T&)
, and template <class T> void
CleanupReleasePushL(T&)
.