glGenBuffers在Release Build中崩溃

Yel*_*low 5 c++ opengl qt4

我在使用OpenGL函数glGenBuffers()时面临一个奇怪的问题.我正在编写一个相当简单的应用程序,其中我使用以下列方式声明的VBO:

#include <QGLFunctions>
#include <QGLWidget>

class MyClass : public QGLWidget, protected QGLFunctions {
    GLuint vertexBufferObject;

    // ...
    GLuint makeBufferList(void);
}

GLuint MyClass::makeBufferList(void) {
    vertexBufferObject = 0;
    glGenBuffers(1, &vertexBufferObject);  // <-- Here it crashes

    // ... load data and render

    return vertexBufferList;
}

MyClass::MyClass(QWidget* parent) 
    : QGLWidget(parent),
      vertexBufferObject(0)
{
    QGLContext* context = new QGLContext(this->format());
    initializeGLFunctions(context);
    glInit();
}

MyClass::~MyClass() {
    glDeleteBuffers(1, &vertexBufferObject);
}
Run Code Online (Sandbox Code Playgroud)

这一切在Debug Build中完全正常.数据渲染得很好,所有程序最终都能正确完成.但是,在Release Build中,glGenBuffers()会使程序崩溃.它不仅返回0或什么都不做,它在函数调用时崩溃.但由于问题只发生在Release模式下,我无法使用调试器找出出错的地方.

我正在研究Windows 7系统并在Qt 4.8.1中进行开发.编译器是MSVC 2010(Qt SDK)编译器.

有没有人有任何我可能会尝试的建议?

//编辑:

也许有用的知道:我尝试使用GCC(Qt SDK)编译器在Mac上编译完全相同的代码,并且Debug和Release Build都可以正常工作.但在Windows 7上,问题仍然存在.

Yel*_*low 4

找到了问题(感谢@MahmoudFayez):问题来自于 Qt API 中的一个错误,该错误导致 glGenBuffers() 函数(也可能还有其他函数)崩溃。这个问题直接等同于这里讨论的问题:

解决方案相对简单,但不是很优雅:使用 GLEW 而不是 QGLFunctions。我通过以下方式解决了我的问题:

#include "glew.h"
#include <QGLWidget>

class MyClass : public QGLWidget {
    // ...same as the above
}

MyClass::MyClass(QWidget* parent) 
    : QGLWidget(parent),
      vertexBufferObject(0)
{ 
    makeCurrent();
    glewInit();
}
Run Code Online (Sandbox Code Playgroud)

这解决了一切。缺点是这涉及使用额外的外部依赖项,而使用 Qt 就是为了尽可能兼容,并尽可能减少外部依赖项。不过,看来我们需要等到Qt 5.0发布之后才能修复这个bug。

最后的评论:我无法弄清楚这个错误中的哪一部分仅导致发布版本崩溃,而不是调试模式。