2012-04-19 38 views
3

在發佈模式下使用Qt 4.8在Windows 7上編譯我的項目時遇到了一些麻煩。一切工作正常調試,但在發佈我得到一個未處理的異常:0xC0000005:訪問衝突。僅在發佈模式下使用glGenBuffer的未處理異常 - QT

我把它縮小到發生這種情況的線上,這是我生成我的像素緩衝區時的線。 我的第一個猜測是錯誤的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); 
     ... 
} 

同樣,在調試這個偉大工程。爲什麼這隻會在Release上發生?

+0

我會運行你的應用程序使用某種內存檢查器。 – 2012-04-19 15:14:20

+0

要麼pbo_不應該是,或者你沒有正確初始化擴展(glGenBuffers指針爲空)。 – Robinson 2012-04-19 18:31:05

+0

我相信我正在初始化擴展,因爲它在調試模式下工作。 initializeGLFunctions()是我認爲的glewInit等價物。不知道雖然... pbo_是我在類構造函數上初始化的GLuint成員。 – Theo 2012-04-19 19:55:48

回答

4

我明白了。 好像這個問題是與此相關的一個: 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頭包括否則你會得到一個編譯錯誤。