Destructors and Deterministic Memory Management
Georg Wrede
georg.wrede at iki.fi
Tue May 5 04:41:58 PDT 2009
Georg Wrede wrote:
> Sean Kelly wrote:
>> 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.
>
> Err, if one has an object that needs deterministic destruction, then one
> calls it (with say myDelete()) to have it release its resources. Until
> then, of course, it shouldn't get collected. But in any case it won't,
> because we obviously have a handler to it because we still haven't
> decided to destruct it. So I assume there's something I don't understand
> here.
s/handler/reference/
> After we're done with destructing (as in having called myDelete()), then
> we "delete the object", or let it go out of scope. Then it becomes
> eligible for disposal. So, what's the relevance of Disposable here?
>
More information about the Digitalmars-d
mailing list