Object cleanup and weak references
Max Bolingbroke
"batterseapower{no" at sp4/\\/\\}hotmail.com
Sat Oct 28 13:14:38 PDT 2006
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.
2) Even if I removed the call to SDL_Quit it would still fail with an
access violation on SDL_FreeSurface because D has somehow caused it to
go away at the point the destructor was run (Anyone know why? I'm using
Derelict for the SDL imports, by the way).
So, I searched the site and found this guy
(http://www.digitalmars.com/d/archives/digitalmars/D/learn/729.html) who
was trying to do >exactly< the same thing as me, and had exactly the
same problem. I have adopted his solution (an associative array of
references that is added to when a Surface is created and systematically
disposed in the static destructor before SDL_Quit occurs) and it works
nicely, but it means that we have the problem of memory bloat: no
Surface can ever be GCed before the program terminates because the array
of surfaces to kill off holds a reference to every single one!
The perfect solution to this is weak references, but I've done some more
searching and found some posts from a few years back saying that
apparently D does not support these wonderful things!
So, can anyone tell me if this is still true? And if it is, is there
another, cleaner, solution to my problem?
Thanks for any help, and sorry about the long post!
Max
More information about the Digitalmars-d-learn
mailing list