我在 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/