TDPL: Manual invocation of destructor

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Aug 9 12:46:27 PDT 2010


Lutger wrote:
> Steven Schveighoffer wrote:
> 
>> On Mon, 09 Aug 2010 08:28:38 -0400, Andrej Mitrovic
>> <andrej.mitrovich at gmail.com> wrote:
>>
>>> It's rather perplexing, isn't it? It states in TDPL:
>>>
>>> "After you invoke clear, the object is still alive and well, but its
>>> destructor has been called and the object is now carrying its
>>> default-constructed stated. During the next garbage collection, the
>>> destructor is called again, because the garbage collector has no idea in
>>> what state you have left the object."
>> This seems totally wrong, what if an object has no default constructor?
>> The spec used to say (maybe it still does) that a destructor is guaranteed
>> to only ever be called once.
> 
> The spec still does, it is not updated since it describes delete, not clear. 
> 
> If you omit the default constructor, no constructor will be called. Also not for 
> the base classes even if they have a default constructor. This looks like a bug. 

Yes, not calling the constructors of base classes is an implementation 
bug. If a class does not define any constructor at all, it has a de 
facto default constructor. If a class does define some constructor but 
not a parameterless one, it is a bug in the implementation if clear() 
compiles.

> Confusingly, if an object has a default constructor but is constructed from 
> anything else, clear will still call the default constructor.

I think that's reasonable. Otherwise the object would have to remember 
in a hidden state variable which constructor it was initialized from.

> I reckon it is 
> also surprising if you later insert a previously omitted default constructor 
> that the behavior can change a lot, especially when base classes are involved. 

That's a consequence of the implementation bugs above, I think.


Andrei


More information about the Digitalmars-d mailing list