我在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);
}
答案 0 :(得分:1)
类析构函数可以在与创建类的线程不同的线程中运行。可能会发生崩溃,因为OpenGL或SDL可能无法正确处理来自其他线程的清理。
堆分配(GC管理)对象的析构函数不是执行清理的好方法,因为它们的调用无法保证。相反,将代码移动到清理函数,或使用确定性方法来最终确定对象(reference counting或手动内存管理)。