是否有人知道 CppUnit 的扩展,可用于在逐个测试的基础上做出有关内存泄漏的断言。
即 CPPUNIT_ASSERT_NO_LEAKS()?
本质上,当测试的执行导致内存泄漏时,我希望能够使特定测试失败。
是否有人知道 CppUnit 的扩展,可用于在逐个测试的基础上做出有关内存泄漏的断言。
即 CPPUNIT_ASSERT_NO_LEAKS()?
本质上,当测试的执行导致内存泄漏时,我希望能够使特定测试失败。
如果您在 Linux 上运行,则可以使用memcheck运行测试。
手册的客户端请求部分描述了几个有用的宏,其中一个被指出对测试很有用:
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。
CPPUNIT 默认不支持内存泄漏检查。
该项目现已重新启动(已停止很长时间),这可能是 CPPUNIT2 的一个特性,您可以向作者提出(或写信)。
如果您正在寻找支持内存泄漏检测的单元测试框架,您可以尝试查看CppUTest。这是 Martin Fowler 和 Bob Martin 在一些 TDD 课程中使用的项目。这是相当不错的。
在 Windows 上,使用对调试堆的一些调用来让 CppUnit 使用_CrtMemCheckpoint()
和处理此信息是一件非常简单的事情_CrtMemDifference()
:
有以下缺点:
在我工作的地方,我们使用 purify 构建我们的单元测试。然后我们的持续集成平台提取成功/失败的测试用例数量和泄漏字节数(+ lint 和覆盖结果),并将其显示在网页上。我强烈建议这样做。
很抱歉没有提供您想要的解决方案。
我知道现在回答这个问题有点太晚了。但这是来自 Microsoft 的一个很棒的工具。我现在是 linux 用户,但我在 Windows(Visual C++ 和 Qt)中编写代码时使用过它 http://www.microsoft.com/en-us/download/details.aspx?id=20028
不知道,但是您可以使用 Fluid Studios Memory Manager 代码之类的东西,并通过一些调整将其挂钩。或者将其编译到您的测试应用程序中,然后有一个脚本为每个测试运行一次应用程序并整理内存跟踪结果。
I know it's not CppUnit, but boost::test can do memory leak detection.
From 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 );
使用valgrind运行单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测出哪个导致了泄漏。