Order of destruction when garbage collection kicks in

Henning Pohl henning at still-hidden.de
Wed Apr 10 02:48:30 PDT 2013


On Tuesday, 9 April 2013 at 20:46:12 UTC, Steven Schveighoffer 
wrote:
> No.  You are not allowed to access any GC-managed resources 
> inside a destructor.
Okay, I finally found it: 
http://dlang.org/class.html#destructors. But it's not listed 
here: http://dlang.org/garbage.html.
> And it won't be null, because that would be extremely costly.  
> Consider if 300 objects had a pointer to a block of memory.  
> Now those 300 objects all go away.  By your expectation, if the 
> targeted block of memory was collected, the GC would have to 
> spend time going through all those 300 pointers, setting them 
> to null.  When they are about to all be destroyed.  99.99% of 
> the time, that would be wasted, as those 300 objects may not 
> even have destructors that care.
I thought about the case when the user sets the reference to null 
before the destructor was even called.
> A destructor is ONLY for destroying non-GC managed resources, 
> nothing else.  Like an OS file handle for instance.
Imagine this case:

// External C library.
extern(C) {
     alias void* a_handle;
     alias void* b_handle;

     a_handle create_a();
     void destroy_a(a_handle);

     b_handle create_b(a_handle);
     void destroy_b(b_handle);
}

class A {
     this() {
         // An a_handle owns multiple b_handles.
         handle = create_a();
     }

     ~this() {
         // Destroys all bs connected with this a.
         destroy_a(handle);
     }

     private a_handle handle;
}

class B {
     this(A a) {
         this.a = a;
         // Creates a b_handle connected to the given a_handle.
         handle = create_b(a.handle);
     }

     ~this() {
         // a already destroyed -> segfault
         // a still alive -> works
         destroy_b(handle);
     }

     private A a;
     private b_handle handle;
}

Any instance of B always needs to be destructed _before_ the A 
it's connected to. How do you express this in D?


More information about the Digitalmars-d mailing list