Destructor order

Andrea Fontana via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Mar 18 08:07:53 PDT 2016


On Friday, 18 March 2016 at 15:03:14 UTC, Steven Schveighoffer 
wrote:
> 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

Not the case. I'm writing a binding for a library. Class A and B 
wrap c-struct and on d-tor I have to free underlying c object 
calling c-library destroyer. I'm not destroying any 
d/GC-allocated object. But of course i have to destroy c object 
in the correct order... How to?




More information about the Digitalmars-d-learn mailing list