Destructor nonsense on dlang.org

Steven Schveighoffer schveiguy at yahoo.com
Thu May 24 10:57:11 PDT 2012


On Thu, 24 May 2012 13:47:31 -0400, Tove <tove at fransson.se> wrote:

> On Thursday, 24 May 2012 at 17:06:19 UTC, ponce wrote:
>> I really had a hard time to believe it when #D told me so, but there is  
>> no guaranteed order of destruction and as you cannot relies on members  
>> still being alive in a class destructor.
>> All of it can happen when making absolutely no cycles in the object  
>> graph.
>>
>> What I do now is having a close function for each class which hold a  
>> non-memory resource.
>>
>> This is writtent in TDPL, but I wish I was told earlier :)
>
> http://dlang.org/class.html#destructors
>
> "This rule does not apply to auto objects or objects deleted with the  
> DeleteExpression, as the destructor is not being run by the garbage  
> collector, meaning all references are valid."
>
> i.e. non gc resources are fine... and it's also fine if you call  
> clear()... it's only a problem if you rely on automatic collection and  
> reference a object... so there's no need for close, as clear() will do  
> the trick.

There's a big problem with this though.  Your destructor *has no idea*  
whether it's being called from within a collection cycle, or from clear.   
You must assume the most restrictive environment, i.e. that the dtor is  
being called from the GC.

This is even true with struct dtors!

-Steve


More information about the Digitalmars-d mailing list