如何知道函数中的未释放内存?

时间:2019-06-03 04:39:05

标签: c gcc memory-leaks valgrind

我知道人们可以使用Valgrind在执行整个程序时查找内存泄漏。但是现在我想在执行函数期间跟踪未释放的内存。该函数只是程序的一部分,但是它非常复杂,并且包含对其他函数的调用。该程序是Valgrind干净的。

有没有办法做到这一点?谢谢。

1 个答案:

答案 0 :(得分:3)

如果程序没有任何内存泄漏,则意味着其所有功能都没有内存泄漏。如果您运行该程序,请验证该功能是否已针对所有相关用例执行,并且Valgrind找不到任何泄漏,而该功能也没有任何泄漏。

如果只想检测该函数中的泄漏,则只需为其编写一个单元测试,然后在valgrind下运行它。这样一来,使用外部程序界面就可以轻松解决一些可能难以解决的情况。

当然valgrind是动态分析,并且只能检查测试运行期间实际发生的泄漏,因此您必须格外小心才能获得良好的覆盖率。它还可以抑制仍然存在某些看起来像指向某处内存的有效指针的泄漏。这是因为许多库在关闭时都不会费心释放内存(正确的是,系统无论如何都必须清理它),但是有时可能会导致错误的否定情况。静态分析在这方面会更好,但是我不知道有什么好用的—静态地检测无效的内存管理确实非常困难(即使Rust都能可靠地防止事后使用,但只有大多数泄漏,不是全部) )。