What is legal in a destructor?

Sean Kelly sean at f4.ca
Tue Aug 29 08:56:45 PDT 2006


Lutger wrote:
> I'm having some trouble understanding exactly what is and what isn't 
> legal to do in a (non-auto) destructor. I'm thinking about these 
> specifically:
> 
> - using the 'this' pointer as a parameter to make calls to another (from 
> another class or free) function.
> - calling member functions.
> - referencing delegates to member functions.

The three above things are only legal if the functions are final or if 
you can be certain you are calling them from the most derived class 
instance.  Otherwise, there is a possibility that you will be calling 
into an already destroyed portion of the object.  For example:

class C {
     ~this() { fn(); }
     void fn() { printf( "default impl\n" ); }
}

class D : C {
     this() { val = cast(int*)malloc(int.sizeof); *val = 5; }
     ~this() { free(val); }
     void fn() { printf( "%d\n", *val ); }
private int* val;
}

D d = new D;
delete d;

Here, C's dtor calls the virtual function fn, which attempts to print 
val after the memory allocated for val has been freed by D's dtor.  So 
the function may print garbage or you may get an access violation.

> - referencing data fields with types like int.

Should be fine.


Sean



More information about the Digitalmars-d-learn mailing list