delete and references?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Aug 8 06:17:28 PDT 2009


Jeremie Pelletier wrote:
> Jarrett Billingsley Wrote:
> 
>> On Fri, Aug 7, 2009 at 1:20 PM, Aaron Watters<arw1961 at yahoo.com> wrote:
>>> Hi guys.  D looks cool.  A couple of things confuse me.
>>> The first is: what happens if I do a
>>>
>>> delete cl;
>>>
>>> after storing a reference to cl somewhere?  Can I use the stored
>>> reference?  Is it invalid?  Please elucidate, thanks.
>> If you delete something and attempt to use another reference to the
>> deleted object, the behavior's undefined.  Basically the same thing as
>> accessing a dangling pointer in C or C++.  'delete' is really just
>> there for when you *know* that there are no other references and you
>> want to ensure that it gets cleaned up immediately.
> 
> If you're interested in how this behaves in the runtime, "delete cl;" tells the memory manager to reclaim the memory at 'cl'. It does so by putting its block of data back onto its internal freelist. At that point the first 4 bytes are used in a linked list. If you still have references to that memory and then modify it, you break the memory manager internal state, which is gonna be hard to track back. After the memory has been reallocated, your old reference and the new one are now fighting for the same memory block. In either cases, your old reference will cause trouble that will be very hard to isolate.
> 
> A good rule of thumb in D is that if you're unsure whether references are still alive, don't delete the object, the GC will automatically reclaim the memory once it detects there are no more references to it. It is also faster to go that way, lots of delete calls are more expensive than one GC sweep, and the sweep is going to happen sooner or later anyways.
> 
> However, delete is most useful when you need large blocks of data for short periods of time.

Great description.

FWIW, I am trying to convince Walter to not reclaim memory in delete, 
but instead only call destructors. D continues C++'s mistake of 
conflating lifetime termination with memory reclamation.

As there will always be a need for reclaiming memory, malloc can always 
supplant that need.


Andrei



More information about the Digitalmars-d mailing list