Object cleanup and weak references

Lionello Lunesu lionello at lunesu.remove.com
Sun Oct 29 00:55:51 PDT 2006


"Max Bolingbroke" <"batterseapower{no"@sp4/\\/\\}hotmail.com> wrote in 
message news:ei0dnr$lv$1 at digitaldaemon.com...
> Hi,
>
> I was writing a thin wrapper for SDL in D, in which I hoped to do 
> something like the following (very much simplified from real code):
>
> static this()
> { SDL_Init(INIT_EVERYTHING); }
>
> static ~this()
> { SDL_Quit(); }
>
> class Surface()
> {
> SDL_Surface* handle;
>
> public this(char[] filename)
> { handle = IMG_Load(filename); }
>
> ~this()
> { SDL_FreeSurface(handle); }
> }
>
> It looks great and I don't have to remember to explicitly free my 
> surfaces. However, there are two problems with Ds shutdown process that 
> mean this won't work:
>
> 1) In my case the static constructor / destructors were located in a 
> separate "initialize" module, and it turned out that on quit it was being 
> destructed (running SDL_Quit) BEFORE the GC ran and destructed my Surface 
> objects (running SDL_FreeSurface). Clearly we can't Free after we have 
> Quit, so that's problem number 1.

You can force the GC to run a collect: std.gc.fullCollect();
Try doing that in the static ~this. Of course, if there are any pointers (or 
values looking like pointers!) in memory pointing to a surface object, that 
object would still not get deleted, causing an exception.

L. 





More information about the Digitalmars-d-learn mailing list