我报告了这个不完整的测试用例的内存泄漏。如果我传递“nameNameNameNam”而不是泄漏报告。
TEST_F (TestDoesExist, namePassedToCInterface)
{
Accessor accessor(_cInterface, _handle);
accessor.doesExist(std::string("nameNameNameName"));
}
测试中的代码如下所示:
virtual bool doesExist(const std::string& name)
{
bool result;
_cInterface.exists(_txHandle, name.c_str(), &result);
return result;
}
对C接口的调用模拟如下:
class MockDoesExist
{
public:
MockDoesExist() {
handle=Handle();
name = "";
result = true;
}
static void func(Handle _handle, const char* _name, bool* _result) {
// in values
handle = _handle;
name = _name;
// out values
*_result = result;
}
// in values
static Handle handle;
static std::string name;
// out values
static bool result;
};
Handle MockDoesExist::handle;
std::string MockDoesExist::name;
bool MockDoesExist::result;
我正在使用VS 2010 express。
我有:
_CrtMemCheckpoint( &memAtStart );
在测试用例执行之前:
_CrtMemDifference( &memDiff, &memAtStart, &memAtEnd)
后。
我做错了什么?
答案 0 :(得分:10)
无。在测试用例之后调用_CrtMemDifference
,但之前 MockDoesExist
的静态成员被销毁(它们在程序终止之前被销毁)。在测试用例期间,MockDoesExist::name
会被分配您的长字符串。在MSVC的标准库中,存在对短字符串的优化,这意味着每个std :: string都有一个内部16字节的char数组,其中可以存储较短的字符串。只有更长的字符串,它必须从免费商店分配内存。该内存将在字符串的析构函数中释放,在这种情况下,当MockDoesExist::name
被销毁时,即在_CrtMemDifference
被调用之后。
答案 1 :(得分:0)
我认为你做错了什么。一旦MockDoesExist::name
被破坏,报告的“内存泄漏”将消失。