destructor ~this() for static "members." doesn't seem to get called

Derek Parnell derek at psych.ward
Mon Feb 19 02:16:59 PST 2007


On Sun, 18 Feb 2007 18:44:08 -0300, Cesar Rabak wrote:

> sclytrack escreveu:
>> import std.stdio;
>> 
>> class Testb
>> {
>> 	this()
>> 	{
>> 		writefln("testb constructor");
>> 	}
>> 	~this()
>> 	{
>> 		writefln("testb destructor");		//Doesn't output on screen.
>> 	}
>> }
>> 
>> class Testy
>> {
>> 	static Testb inner = null;	//Destructor of Testb doesn't appear to be called.
>> 
>> 	this()
>> 	{
>> 		writefln("testy constructor");
>> 		inner = new Testb();
>> 	}
>> 	~this()
>> 	{
>> 		writefln("testy destructor");
>> 	}
>> }
>> 
>> int main()
>> {
>> 	writefln("gdc version 0.22");
>> 	Testy t = new Testy();
>> 	return 0;
>> }
>> 
>> 
>> It outputs the following lines:
>> ./a.out
>> gdc version 0.22
>> testy constructor
>> testb constructor
>> testy destructor
>> 
>> 
>> The destructor of testb doesn't get called,
>> before the termination of the application,
>> or that is at least my perception.
>> 
> OK, is this supposed to be 'automatic' by the D language definition or a 
> responsibility of the programmer of including an explicit call to testb 
> destructor in the testy one?

It's the programmer responsibility in this situation. I guess you were
expecting that when the main() function ended, that D would go and call the
dtor of all the objects still hanging around. Unfortunately, D doesn't do
that - you need to explictly do that.

Try this ...

------------
import std.stdio;

class Testb
{
    this()
    {
        writefln("testb constructor");
    }
    ~this()
    {
        writefln("testb destructor");
    }
}

class Testy
{
    static Testb inner = null;

    this()
    {
        writefln("testy constructor");
        inner = new Testb();
    }
    ~this()
    {
        writefln("testy destructor");
        if (inner !is null) delete inner;
    }
    static void dtor()
    {
        if (inner !is null) delete inner;
    }
}

// Module destructor. Called when main ends.
static ~this()
{
    Testy.dtor();
}

int main()
{
    Testy t = new Testy();
    return 0;
}

--------------

-- 
Derek Parnell
Melbourne, Australia
"Justice for David Hicks!"
skype: derek.j.parnell


More information about the D.gnu mailing list