std :: string size> = 16时内存泄漏

时间:2012-11-26 12:35:24

标签: c++

我报告了这个不完整的测试用例的内存泄漏。如果我传递“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)

后。

我做错了什么?

2 个答案:

答案 0 :(得分:10)

无。在测试用例之后调用_CrtMemDifference,但之前 MockDoesExist的静态成员被销毁(它们在程序终止之前被销毁)。在测试用例期间,MockDoesExist::name会被分配您的长字符串。在MSVC的标准库中,存在对短字符串的优化,这意味着每个std :: string都有一个内部16字节的char数组,其中可以存储较短的字符串。只有更长的字符串,它必须从免费商店分配内存。该内存将在字符串的析构函数中释放,在这种情况下,当MockDoesExist::name被销毁时,即在_CrtMemDifference被调用之后。

答案 1 :(得分:0)

我认为你做错了什么。一旦MockDoesExist::name被破坏,报告的“内存泄漏”将消失。