我正在测试一个OpenGL应用程序,我故意不删除很多OpenGL结构来检查内存泄漏。
例如,我创建了一个包含多个着色器的数组,但从未调用过glDeleteShader()
然而,valgrind报告没有内存泄漏,
是不是valgrind无法检测到这些内存泄漏,或者是否有一些垃圾收集器落后于我的背部以确保没有发生此类泄漏?
答案 0 :(得分:3)
然而,valgrind报告没有内存泄漏
这是因为Valgrind的默认配置将OpenGL黑名单分析。这是一个简单的原因:大多数OpenGL实现都会垃圾收集它们的对象。当您调用glDelete…
时,所发生的一切就是“外部”可访问的对象名称/ ID与实际的内部表示无关。
在glDelete…
调用之后,OpenGL实现可能必须保留实际数据更长时间;例如,可能仍然存在渲染命令,这些命令引用具有已被“删除”的名称的对象。实际清理通常比glDelete…
的“你的”调用晚得多。此外,大多数OpenGL实现实际上不会释放内存,而是保留它以便使用新创建的名称进行回收。
最重要的是,对于典型的OpenGL实现,Valgrind会报告大量内存泄漏,即使在程序终止时一切都干净整理。因此它被列入黑名单。