C++ glDeleteBuffers()在析构函数调用期间崩溃

C++ glDeleteBuffers()在析构函数调用期间崩溃,c++,qt,opengl,C++,Qt,Opengl,正如Qt用户所知,使用任何OpenGL扩展都会非常麻烦。我的工作方式是扩展QGLFunctions类,如下所示: class Object3D : protected QGLFunctions{ ... } 为了使Object3D能够正确运行,从而能够调用glGenBuffer()等函数,需要调用 initializeGLFunctions(glWidget->context()); 在创建QGLWidget之后,否则当应用程序使用任何扩展函数时,它将导致应用程序崩溃。虽然我

正如Qt用户所知,使用任何OpenGL扩展都会非常麻烦。我的工作方式是扩展QGLFunctions类,如下所示:

 class Object3D : protected QGLFunctions{ 
 ... 
 }
为了使Object3D能够正确运行,从而能够调用glGenBuffer()等函数,需要调用

initializeGLFunctions(glWidget->context());
在创建QGLWidget之后,否则当应用程序使用任何扩展函数时,它将导致应用程序崩溃。虽然我最终可以在Object3D存在期间调用“glGenBuffer()”和其他函数,但它似乎会在~Object3D()调用中崩溃,该调用包含“glDeleteBuffer()”调用。我确信正是这个调用导致应用程序崩溃


有人知道如何解决这个问题吗?我怀疑这是因为QGLWidget在Object3D之前先被删除,所以QGLWidget的上下文消失了。如果是这种情况,我如何确保QGLWidget最后被删除,因为QGLWidget被添加到QMainWindow中,而QMainWindow只是按照添加的顺序删除其子对象?

一般规则是,如果您不能保证OpenGL RAII对象在上下文仍然存在时被销毁,然后不要在OpenAL C++类中包装OpenGL对象。以其他方式管理OpenGL对象的生存期


这是你的代码(你忘了给我们看);只有您可以决定在何处或如何管理类的销毁。您需要一些系统来管理您的对象,以确保以正确的顺序销毁(和创建)对象。

只是在Qt中,我必须实现QGLFunctions类以获取指向扩展的指针。它的初始化需要QGLWidget的上下文。虽然我可以创建使用这些函数的对象,但在它们的析构函数中,调用“glDeleteBuffer()”似乎会导致崩溃。我还需要集中删除吗?@ChaoSXDemon:QT中没有规定你必须使用他们的界面。如果您希望您的代码在桌面GL和GL ES上工作,而不需要自己实现它,那么您只需要这样做。此外,您没有实现该类;你用它。您创建了它的一个实例,代码中想要调用它们的每个地方都使用该实例。虽然我知道你在说什么,但我试着不使用他们的QGLFunctions类,结果它不起作用。我试图将glew.h集成到应用程序中,但它根本无法编译。我甚至尝试编写我自己的QGLFunctions类,该类获取所有指向扩展的正确指针,并且在调用任何扩展函数时(至少是编译后的函数)会导致应用程序崩溃。所以我只剩下使用qgl函数了。有没有更简单的方法不使用QT的GL扩展?@ChaoSXDemon:除了“我尝试了X,但它不起作用”之外,没有任何细节就很难诊断问题。如果你想调查替代方案,尝试它们,如果它失败了,在这里用一个新问题询问它为什么会这样做。@ChaoSXDemon:另外,这忽略了主要问题,即你从它派生对象类,这毫无意义。正如我所说,您创建了一个QGLFunctions实例,并将其提供给您想要使用它的任何人。