使用CppUnit进行内存泄漏检测

时间:2009-06-16 13:20:12

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

是否有人知道CppUnit的扩展可用于通过测试基础对内存泄漏进行测试断言。

即。 CPPUNIT_ASSERT_NO_LEAKS()?

基本上,我希望能够在测试执行导致泄漏内存时失败特定测试。

8 个答案:

答案 0 :(得分:4)

如果您在Linux上运行,则可以使用memcheck运行测试。

本手册的Client Requests部分介绍了几个有用的宏,其中一个用于测试:

  

VALGRIND_COUNT_LEAKS:用前面的泄漏检查发现的内存字节数填充四个参数,泄漏,可疑,可达和被抑制。再次,在调用VALGRIND_DO_LEAK_CHECK之后,在测试工具代码中很有用。

宏在memcheck.h中定义(可能在/usr/include/valgrind中),您想要的序列将类似于

unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
// maybe assert that they're zero!

// call test

unsigned long leaked, dubious, reachable, suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
// etc.

重复每次测试都会很痛苦,所以你可能会编写自己的宏,或者更好的是专门的TestRunner

答案 1 :(得分:3)

默认情况下,CPPUNIT没有内存泄漏检查支持。

该项目现已重新审核(已停止很长时间),这可能是CPPUNIT2的一个功能,您可以向作者提议(或写作)。

如果您正在寻找具有内存泄漏检测支持的单元测试框架,您可以尝试查看CppUTest。这是Martin Fowler和Bob Martin在一些TDD课程中使用的项目。非常好。

答案 2 :(得分:2)

在Windows上,使用_CrtMemCheckpoint()_CrtMemDifference()来使用调试堆的一些调用来让CppUnit对这些信息采取行动是非常简单的事情:

有缺点:

  • 你必须在测试开始时手动放置一些东西以获得检查点(也许有办法将它集成到CppUnit中)
  • 它只是Windows(在各种其他平台上可能有类似的东西)
  • 它仅适用于使用Debug CRT的构建

答案 3 :(得分:1)

在我工作的地方,我们使用purify构建单元测试。然后,我们的持续集成平台同时提取成功/失败的测试用例数量和泄漏字节数(+ lint和覆盖率结果),并在网页上显示。我强烈建议这样做。

很抱歉没有提供您想要的解决方案。

答案 4 :(得分:1)

我知道回答这个问题有点太晚了。但这是微软的一个很棒的工具。我现在是一个linux用户,但是当我在windows中编写代码时,我已经使用了它(Visual C ++和Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028

答案 5 :(得分:0)

不知道这一点,但你可以使用像Fluid Studios内存管理器代码这样的东西,并通过一些调整来解决这个问题。要么将其编译到测试应用程序中,然后让脚本为每个测试运行一次应用程序并整理内存跟踪结果。

答案 6 :(得分:0)

使用valgrind运行单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,以便您可以检测哪一个导致泄漏。

答案 7 :(得分:0)

我知道它不是CppUnit,但是boost :: test可以进行内存泄漏检测。

来自http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html

void detect_memory_leaks( bool on_off );

void break_memory_alloc( long mem_alloc_order_num );