仅在发布模式下使用 glGenBuffer 的未处理异常 - QT
Unhandled Exception using glGenBuffer on Release mode only - QT
我在发布模式下使用 Qt 4.8 在 Windows 7 上编译我的项目时遇到了一些问题。在调试上一切正常,但在发布时我收到一个未经处理的异常:0xC0000005:访问冲突。
我将其缩小到发生这种情况的行,即生成像素缓冲区时。我的第一个猜测是错误的 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);
...
}
同样,这在调试时效果很好。 为什么这只会发生在发布版上?
我明白了。似乎这个问题与这个问题有关:https://forum.qt.io/topic/12492/qt-4-8-qglfunctions-functions-crash-in-release-build
还有一个错误报告可能也与此相关:https://bugreports.qt.io/browse/QTBUG-5729
也许初始化GLFunctions()方法没有获取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);
}
确保在任何 QTOpenGL 标头之前包含 glew.h,否则您将收到编译错误。
相关文章:
- 在c++中实现LinkedList时,应出现未处理的错误
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 在C++程序中使用的迭代器中未处理的异常
- 在 ******.exe 中0x00000000772CA267 (ntdll.dll) 处未处理的异常:0xC0000
- 未处理的异常与 cudaMemcpy2D
- 处理未处理的异常更改C++
- for 循环中未处理的异常
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 为什么此代码导致未处理的异常失败
- 瓦尔格林德:注意到但未处理的国际奥克特尔;是否有必要处理以及如何找到?
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 使用 getline 时未处理的异常
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- 核心消息传递中未处理的异常.dll在程序关闭期间
- 在 Hello World.exe 中0x0F828F0E (ucrtbased.dll) 处未处理的异常: 0xC00
- 从向量中删除元素时未处理的异常
- QML:多个键按 /发布后未处理一些键
- 仅在发布模式下使用 glGenBuffer 的未处理异常 - QT