valgrind 是否检测到 OpenGL 内存泄漏?

Does valgrind detect OpenGL memory leaks?

我正在测试一个 OpenGL 应用程序,我故意不删除大量 OpenGL 结构来检查内存泄漏。

例如,我创建了一个包含多个着色器的数组,但从未调用过 glDeleteShader()

但是 valgrind 报告没有内存泄漏,

是 valgrind 无法检测到这些内存泄漏,还是有一些垃圾收集器在我背后确保不会发生此类泄漏?

However valgrind reports no memory leaks

这是因为 Valgrind 的默认配置将 OpenGL 列入黑名单,使其无法进行分析。这是出于一个简单的原因:大多数 OpenGL 实现都会对它们的对象进行垃圾回收。当您调用 glDelete… 时,所发生的一切都是 "externally" 可访问对象 names/IDs 与实际内部表示分离。

OpenGL 实现可能必须在 glDelete… 调用后保留实际数据更长的时间;例如,可能仍有正在运行的渲染命令引用名称为 "deleted" 的对象。实际清理通常比 glDelete… 的 "your" 调用晚得多。此外,大多数 OpenGL 实现实际上不会释放内存,而是保留它以供使用新创建的名称进行回收。

底线是,对于典型的 OpenGL 实现,Valgrind 会报告大量内存泄漏,即使在程序终止时所有内容都已清理干净。因此被列入黑名单。