sdl - 不能在析构函数中使用 SDL_GL_DeleteContext

标签 sdl d derelict3

我在 D 中创建一个 SDL-OpenGL 应用程序。我正在使用废弃的 SDL 绑定(bind)来完成此操作。

当我运行完我的应用程序后,我想卸载 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);
}

最佳答案

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

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

关于sdl - 不能在析构函数中使用 SDL_GL_DeleteContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795144/

相关文章:

d - 为什么有些功能需要 GC?

c++ - SDL 纹理透明背景

c++ - 将文本绘制到屏幕

d - 如何将 ref/out 函数指针传递给函数?

OS X 上的 Derelict3 D 绑定(bind)

dmd 和 gdc 编译代码不同?

opengl - DerelictGL.reload() 上的 Derelict3 SDL2 和 OpenGL 奇怪的 SIGSEGV

c++ - 在 C/C++ 中生成线程的跨平台方式?

sdl - 在 SDL 中缩放 Sprite

reflection - 在 D 中透明地同步对象中的任意属性