只发布模式中使用glGenBuffer未处理的异常 - QT(Unhandled Exceptio

2019-09-16 15:38发布

我遇到了一些麻烦,而在发布模式使用Qt 4.8编写在Windows 7上我的项目。 一切正常的调试,但在释放我得到一个未处理的异常:0000005:访问冲突。

我把范围缩小到出现这种情况的线,这是当我生成我象素缓冲器。 我的第一个猜想是错误的DLL加载,但我查了可执行文件的Dependency Walker和加载每个DLL是正确的。

这里去我的一些代码:

class CameraView : public QGLWidget, protected QGLFunctions;
void CameraView::initializeGL()
{

    initializeGLFunctions(this->context());

    glGenBuffers(1, &pbo_); //<<<<<  This is where I get the unhandled exception on Release mode
        glBindBuffer(QGLBuffer::PixelUnpackBuffer, pbo_);
        glBufferData(QGLBuffer::PixelUnpackBuffer, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);
        ...
}

再次,这在调试的伟大工程。 为什么这只发生在释放?

Answer 1:

我知道了。 好像这个问题涉及到这一块: https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build

并有可能也涉及一个bug报告: https://bugreports.qt.io/browse/QTBUG-5729

也许initializeGLFunctions()方法是没有得到的GL扩展函数的所有函数指针,我真的不知道为什么,但是这似乎是它。

对我来说,解决办法是停止使用Qt的GL扩展,并开始使用GLEW。

所以,在这里是为我工作:

#include <QtGui/QtGui>
#include <gl/glew.h>
#include <QtOpenGL/QGLWidget>

class CameraView : public QGLWidget;
void CameraView::initializeGL()
{

   //initializeGLFunctions(this->context());
   GLenum init = glewInit();


   // Create buffers
   glGenBuffers(1, &pbo_);

   glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_);
   glBufferData(GL_PIXEL_UNPACK_BUFFER, 3 * sizeof(BYTE) * image_width_ * image_height_, NULL, GL_STREAM_DRAW);

   // Set matrixes
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   glOrtho(0, this->width(), 0, this->height(), 0, 1);
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}

确保glew.h之前任何QTOpenGL头包括否则你会得到一个编译错误。



文章来源: Unhandled Exception using glGenBuffer on Release mode only - QT
标签: c++ qt opengl qt4