Re: Destruction order of local static objects
Am 11.04.2011 13:57, schrieb Jens Auer:
On 8 Apr., 22:42, Daniel Kr?gler<daniel.krueg...@googlemail.com>
There is no constructor part of type B that accepts an A*. I assume you
missed to add it, otherwise this initialization does not make sense to me.
I'm sorry, looks like I had an older version of the example in the
clipboard when I wrote the message. My final version looked like this:
So I have to local static objects where B depends on the presence of A
during destruction, but not on construction. So when I read your
precise answer correctly (many thanks for that!), I conclude that
there is no required order of destruction because the constructions
[This response superseeds a previously written one]
It has been pointed out to me by Jens Maurer, that my interpretation was incorrect and that the standard properly defines the destruction order in this example as well. The essence that guarantees the proper order of destruction of the A and B objects in this example is specified in 3.6.3 [basic.start.term] p. 1:
"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. [ Note: This definition permits concurrent destruction. ?end note ] If an object is initialized statically, the object is destroyed in the same order as if the object was dynamically initialized."
The last sentence makes it clear that it is irrelevant whether the initialization is static or dynamic, the destruction order is determined in either case *as if* the initialization where dynamic.
This means, that createA()::a behaves as if it where created before createB()::b, and thus createA()::a is destroyed after createB()::b. Only the destruction order is observable, though.
I apologize for the possibly caused confusion.
HTH & Greetings from Bremen,
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]