destructors
Daniel Keep
daniel.keep.lists at gmail.com
Tue May 1 06:58:11 PDT 2007
Daniel Giddings wrote:
> Bill Baxter wrote:
>> Is this ok in D?
>>
>>
>> class MyClass
>> {
>> OtherClass a;
>> this() {
>> a = new OtherClass;
>> }
>> ~this() {
>> delete a;
>> }
>> }
>>
>> I was just trying to fix the crash on exit in the tinyXPath code on
>> dsource, and it does the above a lot.
>>
>> --bb
>
> I would expect that to work (it is something I would want to be able to
> do - otherwise you would need a finalise method - yuck), I can't recall
> if I have done it though?
>
> a should still be detected as having objects referencing it until the
> MyClass destructor is finished I would think (if the delete a wasn't
> there). Otherwise you would not be able to rely on any class properties
> as still existing in its destructor (ie a.method() could cause an
> exception as well).
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.
Look at it like this:
> class ObjPtr
> {
> ObjPtr obj;
> this(ObjPtr obj = null) { this.obj = obj; }
> ~this() { ... }
> }
>
> auto a = new ObjPtr;
> auto b = new ObjPtr(a);
> auto c = new ObjPtr(b);
>
> c = null;
> gc.fullCollect();
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
--
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