3

我在 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);
}
4

1 回答 1

1

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

堆分配(GC 管理)对象的析构函数不是执行清理的好方法,因为不能保证它们的调用。相反,将代码移至清理函数,或使用确定性方式来完成对象(引用计数或手动内存管理)。

于 2014-08-14T20:40:41.953 回答