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 会报告大量内存泄漏,即使在程序终止时所有内容都已清理干净。因此被列入黑名单。
我正在测试一个 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 会报告大量内存泄漏,即使在程序终止时所有内容都已清理干净。因此被列入黑名单。