调用 glDeleteBuffersARB 导致段错误

Posted

技术标签:

【中文标题】调用 glDeleteBuffersARB 导致段错误【英文标题】:Call to glDeleteBuffersARB results in segfault 【发布时间】:2011-11-10 19:34:04 【问题描述】:

我试图在我的应用程序中动态删除 VBO,以创建不同大小的新 VBO。但是,当我的程序尝试删除它们时,它会因分段错误而崩溃。

下面是我分配 VBO 的代码:

glGenBuffersARB(1, &_vertexBufferID);
glBindBufferARB(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferDataARB(GL_ARRAY_BUFFER,
                _pMetadata->vertexBufferSize(),
                NULL,
                GL_STATIC_DRAW)

在以下代码中定期将数据添加到 VBO:

glBindBufferARB(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferSubDataARB(GL_ARRAY_BUFFER,
                   _pMetadata->vertexSubBufferOffset(),
                   _pMetadata->vertexSubBufferSize(),
                   &row[0]); // row is a vector<float>

在代码的其他地方,我尝试像这样删除 VBO:

glDeleteBuffersARB(1, &_vertexBufferID)

我在这条线上收到了分段错误。我已确保正确的 OpenGL 上下文在删除时处于活动状态。

【问题讨论】:

顺便说一句,你不需要删除一个VBO只是为了改变它的大小,用不同的大小调用glBufferData就足够了。但也许您的实际应用程序更复杂。 你能像 valgrind 一样运行内存检查吗? @ChristianRau 这实际上工作得很好,但我仍然对这个删除业务感到好奇。 @CoreyD 为此,我们肯定需要更多代码,因为提供的代码很好。 所有尝试删除 VBO 时都会发生这种情况吗?还是仅在一种情况下?您是否验证过 glDeleteBuffersARB 不是空函数指针?另外,你为什么使用 ARB 后缀函数而不是早已接受的标准 VBO 函数? 【参考方案1】:

我曾经调试过一个类似的纹理问题,它是由填充数据时缓冲区溢出引起的。在您的 glBufferSubDataARB 调用之前添加一个边界检查,以确保您不会因偏移量+大小而溢出。查看以 GL_BUFFER_SIZE 作为参数的 glGetBufferParameteriv 以获得要检查的边界

【讨论】:

以上是关于调用 glDeleteBuffersARB 导致段错误的主要内容,如果未能解决你的问题,请参考以下文章

提升信号量导致段错误

嵌套的 DirectConnection 信号导致段错误

调用 -createDirectoryAtURL: 导致崩溃

顶点缓冲区对象(删除进程)opengl

popBackStack导致一次又一次调用片段的oncreateView

mongoose-nodejs 导致超出最大调用堆栈大小,在 mongoose save()