Table of Contents
Not many changes here to cstdlib
. You should note that the
abort()
function does not call the
destructors of automatic nor static objects, so if you're
depending on those to do cleanup, it isn't going to happen.
(The functions registered with atexit()
don't get called either, so you can forget about that
possibility, too.)
The good old exit()
function can be a bit
funky, too, until you look closer. Basically, three points to
remember are:
Static objects are destroyed in reverse order of their creation.
Functions registered with atexit()
are called in
reverse order of registration, once per registration call.
(This isn't actually new.)
The previous two actions are “interleaved,” that is, given this pseudocode:
extern "C or C++" void f1 (void); extern "C or C++" void f2 (void); static Thing obj1; atexit(f1); static Thing obj2; atexit(f2);
then at a call of exit()
,
f2
will be called, then
obj2
will be destroyed, then
f1
will be called, and finally
obj1
will be destroyed. If
f1
or f2
allow an
exception to propagate out of them, Bad Things happen.
Note also that atexit()
is only required to store 32
functions, and the compiler/library might already be using some of
those slots. If you think you may run out, we recommend using
the xatexit
/xexit
combination from libiberty
, which has no such limit.