- Title
- Order of destruction of local static objects and calls to std::atexit
- Status
- cd2
- Section
- 6.10.3.3 [basic.start.dynamic]
- Submitter
- Fraser Ross
Created on 2009-07-28.00:00:00 last changed 199 months ago
Messages
Date: 2010-03-15.00:00:00
[Voted into WP at March, 2010 meeting.]
Date: 2009-10-15.00:00:00
Proposed resolution (October, 2009): Change 6.10.3.3 [basic.start.dynamic] paragraph 3 as follows:
If the completion of the initialization of
a non-local
an object with static storage duration is sequenced before
a call to std::atexit (see <cstdlib> ,
17.5 [support.start.term]), the call to the function passed to
std::atexit is sequenced before the call to the destructor
for the object. If a call to std::atexit is sequenced before
the completion of the initialization of a non-local
an object with static storage duration, the call to the
destructor for the object is sequenced before the call to the function
passed to std::atexit ...
Date: 2016-02-15.00:00:00
17.5 [support.start.term] paragraph 7 says that the order of
destruction of objects with static storage duration and calls to
functions registered by calling std::atexit is given in
6.10.3.3 [basic.start.dynamic]. Paragraph 1 of 6.10.3.3 [basic.start.dynamic]
says, This wording covers both local and namespace-scope objects, so it
fixes the relative ordering of local object destructors with respect
to those of namespace scope. Paragraph 3 says, This fixes the relative ordering of destructors for namespace
scope objects with respect to calls of atexit functions.
However, the relative ordering of local destructors and
atexit functions is left unspecified. In the 2003 Standard, this was clear: 18.3 paragraph 8 said,
If the completion of the constructor or dynamic initialization of an
object with static storage duration is sequenced before that of
another, the completion of the destructor of the second is sequenced
before the initiation of the destructor of the first.
If the completion of the initialization of a non-local object with
static storage duration is sequenced before a call to
std::atexit (see <cstdlib> , 17.5 [support.start.term]), the call to the function passed to std::atexit is
sequenced before the call to the destructor for the object. If a call
to std::atexit is sequenced before the completion of the
initialization of a non-local object with static storage duration, the
call to the destructor for the object is sequenced before the call to
the function passed to std::atexit .
A local static object obj3 is destroyed at the same time it
would be if a function calling the obj3 destructor were
registered with atexit at the completion of the obj3
constructor.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2010-03-29 00:00:00 | admin | set | messages: + msg2663 |
| 2010-03-29 00:00:00 | admin | set | status: ready -> cd2 |
| 2009-11-08 00:00:00 | admin | set | messages: + msg2338 |
| 2009-11-08 00:00:00 | admin | set | status: open -> ready |
| 2009-07-28 00:00:00 | admin | create | |