Destructors and Deterministic Memory Management

Sean Kelly sean at invisibleduck.org
Mon May 4 21:55:37 PDT 2009


dsimcha wrote:
> Two closely related topics here:
> 
> 1.  It is often nice to be able to create a single object that works with both
> GC and deterministic memory management.  The idea is that, if delete is called
> manually, all sub-objects would be freed deterministically, but the object
> could still safely be GC'd.  Since the destructor called by the GC can't
> reference sub-objects, would it be feasible to have two destructors for each
> class, one that is called when delete is invoked manually and another that is
> called by the GC?

You can do this today with both Druntime on D 2.0 and Tango on D 1.0, 
though it isn't the most performant approach.  The code would look 
something like this:

import core.runtime;

interface Disposable
{
     void dispose();
}

bool handler( Object o )
{
     auto d = cast(Disposable) o;

     if( d !is null )
     {
         d.dispose();
         return false;
     }
     return true;
}

static this()
{
     Runtime.collectHandler = &handler;
}

If you return false from your collectHandler then the runtime won't call 
the object's dtor.



More information about the Digitalmars-d mailing list