析构函数中不能使用SDL_GL_DeleteContext

时间:2014-04-01 19:27:45

标签: sdl d derelict3

我在D中创建了一个SDL-OpenGL应用程序。我正在使用Derelict SDL绑定来完成此任务。

当我完成运行我的应用程序时,我想卸载SDL。为此,我运行以下功能:

public ~this() {
    SDL_GL_DeleteContext(renderContext);
    SDL_DestroyWindow(window);
}

出于某种原因,这会给我一个模糊的分段错误(GDB中没有跟踪)并返回-11。我是否可以在析构函数中销毁SDL,甚至在使用后还要销毁SDL?

我的构造函数:

window = SDL_CreateWindow("TEST", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP);
if(window == null) {
    string error = to!string(SDL_GetError());
    throw new Exception(error);
}

renderContext = SDL_GL_CreateContext(window);
if(renderContext == null) {
    string error = to!string(SDL_GetError());
    throw new Exception(error);
}

1 个答案:

答案 0 :(得分:1)

类析构函数可以在与创建类的线程不同的线程中运行。可能会发生崩溃,因为OpenGL或SDL可能无法正确处理来自其他线程的清理。

堆分配(GC管理)对象的析构函数不是执行清理的好方法,因为它们的调用无法保证。相反,将代码移动到清理函数,或使用确定性方法来最终确定对象(reference counting或手动内存管理)。