我刚刚解决了应用程序中的内存泄漏问题,现在我想编写一个单元测试来确保不再发生这种情况。
我正在寻找一种在某些功能之前和之后检测当前应用程序(工作集)的内存使用情况的方法。
例如:
long mem_used= GetMemUsed();
/* Do some work */
/* clean up */
if( mem_used != GetMemUsed() ) {
Error( "Memory leek" );
}
我发现有很多方法可以检测整个系统的内存使用情况,但是目前的应用程序都没有。
建议,链接,代码片段?
答案 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)
Process Explorer(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)适用于此。