TDPL: Manual invocation of destructor

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Aug 9 13:31:39 PDT 2010


Steven Schveighoffer wrote:
> On Mon, 09 Aug 2010 15:46:27 -0400, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> 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.
> 
> How can this be decided at compile time?
> 
> basic counter-example:
> 
> class C
> {
>    this(int x) {}
> }
> 
> // how do you statically disable this?
> void foo(Object o)
> {
>   clear(o);
> }
> 
> void foo(C c)
> {
>    auto c = new C(1);
>    foo(c);
> }

Sorry, I got things mixed.

> I always thought clear would simply overwrite the object with it's 
> default data as defined in the TypeInfo (i.e. before a constructor is 
> normally called).  Calling the constructor is absolutely wrong.  We 
> don't want to reset the object, we want to free it's resources.  
> Re-constructing it may reallocate resources *THAT WE JUST ASKED TO BE 
> DESTROYED MANUALLY*.  To say clear as defined is a replacement for 
> delete is complete fantasy.

Well this is my view as well and the original intent of clear(). The 
problem is, if someone defined a default constructor, they presumably 
have a nontrivial invariant to satisfy. I'm unclear on what's the best 
path to take.

Andrei


More information about the Digitalmars-d mailing list