Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VAO删除会导致奇怪的内存问题_C++_Opengl_Memory Leaks - Fatal编程技术网

C++ VAO删除会导致奇怪的内存问题

C++ VAO删除会导致奇怪的内存问题,c++,opengl,memory-leaks,C++,Opengl,Memory Leaks,我有一个如下的渲染周期:导入模型->绘制它(一些帧…)->删除它。为了绘制模型,我正在使用vao/vbo/ebo 现在,在删除阶段使用以下代码: GLDeleteVertexArray(1,&vao); glDeleteBuffers(1和vbo); glDeleteBuffers(1和ebo) 在Xcode分配工具中分析时,我得到 然而,如果代码的编写方式如下: glDeleteBuffers(1和vbo); glDeleteBuffers(1和ebo); GLDeleteVertexArr

我有一个如下的渲染周期:导入模型->绘制它(一些帧…)->删除它。为了绘制模型,我正在使用vao/vbo/ebo

现在,在删除阶段使用以下代码:

GLDeleteVertexArray(1,&vao);
glDeleteBuffers(1和vbo);
glDeleteBuffers(1和ebo)

在Xcode分配工具中分析时,我得到

然而,如果代码的编写方式如下:

glDeleteBuffers(1和vbo);
glDeleteBuffers(1和ebo);
GLDeleteVertexArray(1和vao)

突然它显示:

为什么会这样?我只改变了
glDeleteVAO
/
glDeleteBuffers
的顺序,然后得到了这个奇怪的“内存泄漏”。所有这3行代码都放在dctor中,不会分布在整个应用程序中

另外,
glIsBuffer()
删除vbo、vao后,在所有这些情况下,ebo在所有缓冲区上都返回0


在os x el capitan上使用opengl 4.1

我相信opengl不会真正删除某些东西,除非所有使用它的东西都被解除绑定并删除。您是否已尝试先明确解除所有这些绑定(通过将各个部分绑定到
0
)?我怀疑,它也可以自行决定清理。我不记得标准太明确了。@WilliamKappler我已经解除了所有缓冲区的绑定。OpenGL实际上在引用计数达到零后释放内存。但是改变呼叫顺序有什么帮助呢?如果它真的做到了,那么呼叫顺序不应该改变行为。但是OpenGL实现是出了名的敏感。您可能希望在其他系统(或其他驱动程序)上运行测试,看看结果是否不同。@ibe:“我已经解除了所有缓冲区的绑定”的确切含义是什么?如果VAO(不是缓冲区)仍然处于绑定状态,则该行为完全可以理解。但即使不是这样,GL实现基本上可以无限期地延迟解除分配,并且它以后可能会重新使用资源,而不是将其返回给操作系统。@derhass当调用
glDeleteVertexArray()
时,VAO会自动解除绑定。在任何情况下,这里的一个更具决定性的测试是重复执行代码序列,并查看内存使用是否持续增加。如果是这样,那可能是OpenGL实现中的一个bug。