Static destructors called before class instance destructors

Sean Kelly sean at f4.ca
Sun Jul 22 10:55:15 PDT 2007


rkreis wrote:
> Good day.
> 
> Using derelict, I noticed bad behavior: The app segfaulted inside of 
> destructors. I later found out that derelict unloaded libraries and the 
> destructor, freeing resources, tried to call such unloaded functions. 
> This happens because a static destructor unloads all libraries. A simple 
> test case shows that static destructors can be called before all 
> instances are destructed. If an instance destructor then uses resources 
> freed by the static destructor, things become problematic.
> 
> import std.stdio;
> 
> class Dude {
>     private static char[] eek;
> 
>     public this() {
>         writefln("Dude ctor");
>     }
> 
>     public ~this() {
>         writefln("Dude dtor - eek is '%s'", eek);
>     }
> 
>     public static this() {
>         writefln("Dude static ctor");
>         eek = "Everything up and running";
>     }
> 
>     public static ~this() {
>         writefln("Dude static dtor");
>         eek = "You're doomed";
>     }
> }
> 
> void main() {
>     Dude d = new Dude();
> }
> outputs
> Dude static ctor
> Dude ctor
> Dude static dtor
> Dude dtor - eek is 'You're doomed'

Funny, I've recently been trying to decide how to handle this exact 
situation.  When a D application shuts down, unreachable objects 
may/will be collected then static dtors are run.  After that, there may 
still be valid D objects floating around, either which the GC 
incorrectly thought were reachable or that were reachable through static 
references.  Should these objects never be finalized?  This would 
certainly be the easier/cleaner approach to take, but I'm not sure how I 
feel about leaving objects un-finalized.


Sean



More information about the Digitalmars-d mailing list