destructors
Daniel Keep
daniel.keep.lists at gmail.com
Tue May 1 17:04:03 PDT 2007
Daniel Giddings wrote:
> Daniel Keep wrote:
>>
>>
>> Exactly. You can't.
>>
>> Long story short is thus: the *only* thing you can say for sure still
>> exists when your destructor is called, is your own object's memory.
>
> Yuck - I never really thought about this. So destructors in D are almost
> as useless as the __del__ method in Python :-(
>
>> Question: what order do the objects get destroyed in?
>> Answer: no one knows.
>>
>> The problem is that in order for the GC to destroy objects in "the right
>> order", it would have to build a complete dependency graph between the
>> various objects, then destroy them in the right order.
>>
>> But what happens if you've got a *lot* of objects, or those objects
>> don't care what order they're destroyed in, or worse: cycles. If you've
>> got cycles, the GC is stuffed, and there *is* no correct order to
>> destroy them in.
>>
>> There was a thread quite some time ago that demonstrated a hacked
>> version of phobos that allowed destructors to take a bool argument that
>> told the destructor if the object was being destroyed deterministically
>> (ie: via the delete statement, or because the object was scoped) or not.
>> Sadly, it never caught on :(
>>
>> -- Daniel
>>
>
> The bool would be incredibly handy as you'd be able to still do
> destructor type things safely with explicit deletes.
>
> I suppose an alternative would be something like
>
> class MyClass
> {
> OtherClass a;
> this() { a = new OtherClass; }
> MyClass destroy() { delete a; delete this; return null; }
> // is the return null above ok in D? - it seemed ok when run
> }
>
> then you'd know when its been explicitly deleted.
>
> MyClass m = new MyClass;
> ....
> m = m.destroy();
The other thing I started doing in some of my code was to use the following:
interface Disposable
{
void dispose();
}
void dispose(Object obj)
{
if( auto dobj = cast(Disposable)obj )
dobj.dispose();
}
Yes, you have to do it manually, but at least you can do it *safely*. I
think Tango has something similar :P
-- Daniel
--
int getRandomNumber()
{
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}
http://xkcd.com/
v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D
i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
More information about the Digitalmars-d-learn
mailing list