Destructor order

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 18 08:03:14 PDT 2016


On 3/18/16 10:58 AM, Andrea Fontana wrote:
> On Friday, 18 March 2016 at 14:53:20 UTC, Steven Schveighoffer wrote:
>> On 3/18/16 7:44 AM, Nicholas Wilson wrote:
>>> On Friday, 18 March 2016 at 10:20:40 UTC, Temtaime wrote:
>>>> Hi !
>>>> I wonder if i can rely on this code :
>>>>
>>>> http://dpaste.dzfl.pl/745cc5b1cdfb
>>>>
>>>> There's two questions:
>>>> 1) Is dtors always called in reverse order ?
>>> yes
>>>> 2) Is all the dtors always called when i call destroy ?
>>> yes. destroy calls __dtor() which recursively call __dtor() on its
>>> members
>>
>> I think technically not true. If you call __dtor directly, it does not
>> recurse. But this is an implementation detail.
>>
>
> Why doesn't this print ~B ~A?
> http://dpaste.dzfl.pl/0bef0a4316b7
>
> It raises a bug on my code because dtor are called in "wrong" order.
> b holds a ref to a, why a is desctructed before b?

Structs are contained completely within the class instance memory block 
(e.g. the OP's code). Classes are references. They are not destroyed 
when you destroy the holder, that is left up to the GC, which can 
destroy in any order. And in fact, it's a programming error to destroy 
any GC-allocated memory inside your dtor, because it may already be gone!

-Steve


More information about the Digitalmars-d-learn mailing list