TDPL: Manual invocation of destructor
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Aug 9 12:41:03 PDT 2010
Max Samukha wrote:
> On 08/09/2010 03:40 PM, 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.
>>
>> I honestly thought the point of clear was to simply leave the memory in
>> place as a kind of "zombie" object until the GC could collect it, to
>> avoid having the block get recycled into a new object, and then use an
>> old reference to it (via delete). I didn't know someone would ever
>> purposefully use it. What is the point of calling clear then, if clear
>> doesn't get rid of the object and leave it uninitialized?
>>
>>> But in what situation would you want to manipulate an object that was
>>> already cleared and ready for garbage collection?
>>
>> None. That's the point. clear is saying "I don't want to use this object
>> any more". The runtime (I thought) was just being conservative and
>> leaving the memory in place until it could verify there were no other
>> pointers to it.
>>
>> I'm starting to climb the fence into the "leave delete in the language"
>> camp...
>>
>> -Steve
>
> I agree. The whole purpose of clearing a GC-allocated object is
> deterministically freeing the resources the object may have acquired.
> Otherwise, it could as well be left alive until the next garbage
> collection cycle. Reconstructing the object is not a good idea since the
> object may, for example, acquire an expensive resource in its
> constructor etc.
>
> FWIW, C# solved the problem years ago by separating the destructor
> (IDisposable.Dispose) from finalizer. Let's learn something from it.
I thought we did!
Andrei
More information about the Digitalmars-d
mailing list