我很惊讶Google C++测试框架没有显式支持检查内存泄漏。然而,对于Microsoft Visual C++,有一个变通方法,但是对于Linux呢?
如果内存管理对我很重要,那么使用另一个C++单元测试框架是否更好呢?
我很惊讶Google C++测试框架没有显式支持检查内存泄漏。然而,对于Microsoft Visual C++,有一个变通方法,但是对于Linux呢?
如果内存管理对我很重要,那么使用另一个C++单元测试框架是否更好呢?
#include "gtest/gtest.h"
#include <crtdbg.h>
class MemoryLeakDetector {
public:
MemoryLeakDetector() {
_CrtMemCheckpoint(&memState_);
}
~MemoryLeakDetector() {
_CrtMemState stateNow, stateDiff;
_CrtMemCheckpoint(&stateNow);
int diffResult = _CrtMemDifference(&stateDiff, &memState_, &stateNow);
if (diffResult)
reportFailure(stateDiff.lSizes[1]);
}
private:
void reportFailure(unsigned int unfreedBytes) {
FAIL() << "Memory leak of " << unfreedBytes << " byte(s) detected.";
}
_CrtMemState memState_;
};
然后只需在你的测试中添加本地的MemoryLeakDetector:
TEST(TestCase, Test) {
// Do memory leak detection for this test
MemoryLeakDetector leakDetector;
//Your test code
}
示例:
一个类似这样的测试:
TEST(MEMORY, FORCE_LEAK) {
MemoryLeakDetector leakDetector;
int* dummy = new int;
}
生成以下输出:
我相信有更好的工具,但这是一种非常简单易用的解决方案。
"我很惊讶谷歌的 C++ 测试框架不明确支持检测内存泄漏。"
它从未旨在做到这一点。你实际上可以进行一些认证,例如使用 Google Mock 并设置预期的调用(例如析构函数)。但是使用专门针对此方面的工具肯定比你自己编写的任何内容都要好。
"使用其他 C++ 单元测试框架是否更好?"
那么为什么要寻找不同的单元测试框架(也不支持这个功能,至少我不知道有哪个)。
有一些工具,例如 Valgrind,你可以使用并在其控制下运行你的 UnitTester
可执行文件以检测内存泄漏。
注意:
上述建议在 UnitTester
可执行文件中执行此操作将无法捕获代码生成的最终可执行文件中可能出现的所有内存泄漏,但只能帮助发现实际测试代码中的错误/缺陷。
UnitTester
)。好吧,不同的工具有不同的用途,你可以自由地组合它们以实现你想要分析的目标。 - πάντα ῥεῖ--gtest.valgrind
这样的标志,而不是在valgrind上运行gtest。 - HCSF不确定这个方法在2015年是否有效,但自2018年左右起,我们使用带有CLang的sanitizers(包括LeakSanitizer、AddressSanitizer和UndefinedBehavior sanitizer)的GoogleTest。
只需启用sanitizers构建测试,例如基于CMake的项目:
add_compile_options(-fsanitize=leak,address,undefined -fno-omit-frame-pointer -fno-common -O1)
link_libraries(-fsanitize=leak,address,undefined)
内存泄漏是由于系统接口的错误使用而导致的,单元测试应该检查在您的测试单元中这些接口是否被正确使用,而不是这些接口的实现特定结果。它应该检查直接由您的单元使用的内存分配和释放接口是否按设计使用。测试系统特定结果将成为组件或集成测试的一部分。在单元测试中,内存管理接口对于测试单元来说是外部的,因此应该使用测试实现进行存根处理。