Re: Allocation during process exit
On Apr 2, 7:47 pm, Christopher <cp...@austin.rr.com> wrote:
On Apr 2, 12:35 pm, "Victor Bazarov" <v.Abaza...@comAcast.net> wrote:
Christopher wrote:
After all, how can I allocate a new global when the
process is trying to deallocate all globals?
Who said anything about allocating "a new global"? Dynamic
storage duration and static storage duration are not the
same thing.
Its hard to say as I don't have access to the source causing
the problem, only my dependent source, but looking at the call
stack it appears as though:
1 the process has begun termination
2 global and statics have begun to be deallocated
Objects with static lifetime are never deallocated. If they
have non trivial destructors, the destructors are called (along
with any functions registered with atexit) when exit() is called
(normally by returning from main). System services are required
to work at least until this phase has finished.
3 some class in its deconstruction makes a call to a singleton's
GetInstance() method
4 the singleton, in turn, attempts to allocate itself using new and
its constructor,
5 new calls malloc
6 malloc calls _int_malloc
7 _int_ malloc calls _malloc_consolidate()
8 process hangs and never exits
Most likely, you've corrupted the free space arena somewhere
previously. Malloc and operator new are required to work until
all user code has finished executing, and I've never seen a
system where this wasn't the case.
I use the word 'global' to describe the singleton, as its
usually a pointer or reference defined globally which points
to or refers to some memory on the heap.
Actually, one frequent singleton idiom is to use a static
variable in the instance() function. Usually, when a pointer is
used, it is because the author of the singleton doesn't want its
destructor called. Ever.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34