C++ 使用CppUnit进行内存泄漏检测

C++ 使用CppUnit进行内存泄漏检测,c++,unit-testing,memory-leaks,cppunit,C++,Unit Testing,Memory Leaks,Cppunit,是否有人知道CPPFUnit的扩展可以用于在逐个测试的基础上对内存泄漏进行断言 i、 e.CPPFUnit断言无泄漏() 本质上,我希望在执行测试导致内存泄漏时,能够使特定测试失败。不知道这一点,但您可以使用类似Fluid Studio内存管理器的代码,并通过一些调整将其挂接在自己的内存中。或者将其编译到您的测试应用程序中,然后使用脚本为每个测试运行一次应用程序,并整理内存跟踪结果。如果您在Linux上运行,则可以使用 本手册的这一节介绍了几个有用的宏,其中一个宏用于测试: VALGRIND\u

是否有人知道CPPFUnit的扩展可以用于在逐个测试的基础上对内存泄漏进行断言

i、 e.CPPFUnit断言无泄漏()


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

不知道这一点,但您可以使用类似Fluid Studio内存管理器的代码,并通过一些调整将其挂接在自己的内存中。或者将其编译到您的测试应用程序中,然后使用脚本为每个测试运行一次应用程序,并整理内存跟踪结果。

如果您在Linux上运行,则可以使用

本手册的这一节介绍了几个有用的宏,其中一个宏用于测试:

VALGRIND\u COUNT\u LEAKS
:用上一次泄漏检查发现的泄漏、可疑、可访问和抑制的内存字节数填充四个参数。同样,在调用
VALGRIND\u DO\u LEAK\u 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.

在每个测试中重复这一点都是一件痛苦的事情,因此您可以编写自己的宏,或者更好的是,编写专门的宏。

CPPUNIT默认情况下不支持内存泄漏检查

该项目现在已重新开始(已停止很长时间),这可能是CPPUNT2的一个功能,您可以向作者提出(或写信)


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

使用运行单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测出哪一个是导致泄漏的原因。

在Windows上,使用一些对调试堆的调用,让CppUnit使用
\u CrtMemCheckpoint()
\u CrtMemDifference()
来处理这些信息,这将是一件非常简单的事情:

有一些缺点:

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

我知道它不是CPPFUnit,但boost::test可以检测内存泄漏

发件人:

void检测内存泄漏(bool开/关)


void break\u memory\u alloc(长mem\u alloc\u order\u num)

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


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

我知道现在回答这个问题有点太晚了。但是这里有一个来自微软的很棒的工具。我现在是Linux用户,但是我在Windows中编写代码时使用了这个(Visual C++和Qt)

CppUTest是我以前从未见过的东西……谢谢!看起来那里有一些对记忆测试的基本支持。现在查看CppUnit 2文档……应该注意链接页面中的这一部分:“不幸的是,目前该功能仅针对Microsoft系列编译器(以及Intel,如果它采用Microsoft C运行时库的话)实施。此外,它不能针对监视器的每个实例进行调优,只能在整个程序执行完成后全局触发并报告。在将来,这应该得到改进。”