1

对于这个不完整的测试用例,我收到了内存泄漏报告。如果我通过“nameNameNameName”代替,则没有泄漏报告。

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)

后。

我究竟做错了什么?

4

2 回答 2

10

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

于 2012-11-26T12:43:55.753 回答
0

我不认为你做错了什么。一旦MockDoesExist::name被销毁,报告的“内存泄漏”就会消失。

于 2012-11-26T12:43:10.940 回答