QtOpenGLWidget的析构问题QOpenGLVertexArrayObject::destroy() failed to restore current context

OpenGL对自身的上下文是非常敏感的,稍有不慎可能就会导致内存泄漏,或者没有释放正确,就比如 QOpenGLVertexArrayObject::destroy() failed to restore current context 问题,由于上下文的问题没有办法正确的释放QOpenGLVertexArrayObject VAO对象。

发生的原因:我想在QOpenGLWidget的析构函数 delete 掉我的网格类对象,网格类对象内使用了VAO对象也就是QOpenGLVertexArrayObject 这个类,两个类的析构大致如下

Mesh类:

Mesh::~Mesh(){
  	m_VBO.destroy();
	m_VAO.destroy();
}

MyOpenGLWidget类:

MyOpenGLWidget::~MyOpenGLWidget(){
    delete mesh;
}

在关闭窗口后控制台面板就输出了这个问题

解决方法:

这个问题的原因就是因为在OpenGL窗口结束了之后,最后在析构的时候还有使用到OpenGL的东西,就是delete mesh对象时mesh的析构又调用了QtOpenGL相关内容导致的OpenGL上下文不正确。

所以在MyOpenGLWidget的析构函数中加入下面的函数来确保上下文正确。

MyOpenGLWidget::~MyOpenGLWidget(){
    // 确保释放opengl资源时上下文正确
    makeCurrent();
    delete mesh;
    doneCurrent();

}

这也是我现阶段所学的OpenGL知道的一个解决办法,如果还有其他办法再说吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值