TDPL: Manual invocation of destructor

Steven Schveighoffer schveiguy at yahoo.com
Mon Aug 9 13:00:49 PDT 2010


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);
}

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.

-Steve


More information about the Digitalmars-d mailing list