1) You don't need to call unload on any Derelict loaders. That is handled automatically by Derelict using static module destructors just as you have here. And that leads to
That good to know.

2) Module destructors are run before the gc runs its final collection at shutdown. So if in a destructor you try to call into one of the libraries Derelict binds, you will be calling into a library that is already unloaded, hence the error.
As I thought. But I have currently no real solution for that.

Never rely on destructors to release memory. Aside from this Derelict-specific issue, you have no control over when, if, or in what order the destructors are called. This can lead to all sorts of subtle bugs.
Never heard of RAII? ;) D structs should be able to do this technique. That's why I do this that way. It's more comfortable and you don't forget to free memory.

The IMO ideal way to handle this is to give your app a terminate() function somewhere that is always called before the app exits and which initiates a clean release of system resources. Assuming a game:

****
void main() {
    initialize();
    run();
    scope(exit) terminate();
}

void terminate() {
    Game.terminate();
    Audio.terminate();
    Network.terminate();
    Graphics.terminate();
    ...
}
****

I adopted this style long ago in C and it applies well to D. I never rely on destructors except for logging, statistics, or other non-critical things. I release all C-side memory through a terminate chain.

Well, maybe I could adapt it to my problem. It's a bit annoying that you have to call it by yourself. :)

Reply via email to