January 23, 2011
When I was using a class to wrap SDL functions and structs, I would have a
problem that Derelict would unload before the garbage-collector cleaned up my
classes, resulting in errors when these classes destructed and tried to call
SDL functions in the process. However, the exact same code using structs to
wrap instead of classes does not produce these errors. For example, rather
than using
scope screen = new Screen(800, 600)
where Screen is a scope class, I'm using
auto screen = new Screen(800, 600)
where Screen is a struct. This also provides me the advantage of being able to
use delegates which use screen. Is there a reason for this?
January 23, 2011
On Saturday 22 January 2011 17:27:18 Sean Eskapp wrote:
> When I was using a class to wrap SDL functions and structs, I would have a
> problem that Derelict would unload before the garbage-collector cleaned up
> my classes, resulting in errors when these classes destructed and tried to
> call SDL functions in the process. However, the exact same code using
> structs to wrap instead of classes does not produce these errors. For
> example, rather than using
> scope screen = new Screen(800, 600)
> where Screen is a scope class, I'm using
> auto screen = new Screen(800, 600)
> where Screen is a struct. This also provides me the advantage of being able
> to use delegates which use screen. Is there a reason for this?

Well, IIRC struct destructors don't currently ever get called for any structs on the heap. So, there's no way that you'd get a problem when such a destructor runs, because it never runs.

There are several bugs relating to struct destructors, and I'm not 100% sure what the current state of them is (I believe that they work properly for normal RAII), but in particular, for the moment, don't create a struct with new and expect its destructor to be run.

http://d.puremagic.com/issues/show_bug.cgi?id=2834

- Jonathan M Davis