Mak*_*gan 3 c++ memory opengl valgrind memory-leaks
我正在测试一个 OpenGL 应用程序,我故意不删除大量 OpenGL 构造来检查内存泄漏。
例如,我创建了一个包含多个着色器的数组,但从未调用过 glDeleteShader()
然而 valgrind 报告没有内存泄漏,
是 valgrind 无法检测到这些内存泄漏,还是有一些垃圾收集器在我背后确保不会发生此类泄漏?
但是 valgrind 报告没有内存泄漏
那是因为 Valgrind 的默认配置将 OpenGL 列入黑名单,以免对其进行分析。这是出于一个简单的原因:大多数 OpenGL 实现都会对它们的对象进行垃圾收集。当您调用glDelete…然后所有发生的事情是,“外部”可访问的对象名称/ID 与实际的内部表示分离。
OpenGL 实现可能必须在glDelete…调用后保留实际数据更长的时间;例如,可能仍然存在正在执行的渲染命令,这些命令引用了名称已被“删除”的对象。实际的清理通常比“您的”调用glDelete…. 此外,大多数 OpenGL 实现实际上不会释放内存,而是保留它以使用新创建的名称进行回收。
底线是,使用典型的 OpenGL 实现 Valgrind 会报告大量内存泄漏,即使一切都在程序终止时清理干净。因此被列入黑名单。