内存泄漏单元测试c ++

时间:2010-08-24 18:49:05

标签: c++ unit-testing memory-leaks

我刚刚解决了应用程序中的内存泄漏问题,现在我想编写一个单元测试来确保不再发生这种情况。

我正在寻找一种在某些功能之前和之后检测当前应用程序(工作集)的内存使用情况的方法。

例如:

long mem_used= GetMemUsed(); 
/* Do some work */
/* clean up */

if( mem_used != GetMemUsed() ) {
    Error( "Memory leek" ); 
}

我发现有很多方法可以检测整个系统的内存使用情况,但是目前的应用程序都没有。

建议,链接,代码片段?

6 个答案:

答案 0 :(得分:6)

Boost.Test会在测试运行结束时自动告诉您是否有任何单元测试泄露了内存。

我不知道是否有任何其他C ++单元测试框架提供这种功能。

答案 1 :(得分:5)

我真的很喜欢ValGrind这类事情。这些工具已经存在;你不需要编写自己的单元测试来检测内存泄漏。

答案 2 :(得分:3)

这不是单元测试。如果您想确保某个应该管理资源的单元不泄漏该资源,那么您需要验证它正在管理的资源是否在正确的时间被删除。您可以使用模拟对象来执行此操作,这些对象在构造时递增计数器并在删除时递减...然后确保计数正确。

检查整个应用程序的内存使用情况的测试不适用于单元测试。单元测试适用于应用程序中的特定单元。

答案 3 :(得分:3)

对于使用GLibC的Linux或其他系统,有functions来获取内存分配统计信息。假设没有延迟分配,您应该在执行测试之前和之后将相同的内存提交给malloc。

答案 4 :(得分:0)

您还可以使用 Google测试框架gtest),然后使用Google性能工具(gperf)查找泄漏信息。 GPerf放入一个替换内存库,如果在测试运行完成后发现内存泄漏,它会让你知道并为你提供一个pprof命令来运行几种不同的输出格式 - 文本,点,web等。这个工具将找到测试和生产代码中的泄漏。

我还使用Valgrind来确认是否存在泄漏,但更喜欢gperf。一个问题是,如果您使用gperf内存库进行编译并尝试使用Valgrind,则不会发现任何问题,因为它会捕获泄漏,因此您需要在切换之间清除编译或拥有该项目的第二份副本。

答案 5 :(得分:-1)