调用 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 导致段错误的主要内容,如果未能解决你的问题,请参考以下文章
调用 -createDirectoryAtURL: 导致崩溃