1

この不完全なテスト ケースでメモリ リークが報告されています。代わりに「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)

後。

私は何を間違っていますか?

4

2 に答える 2

10

何もない。は_CrtMemDifference、テスト ケースの後、静的メンバーが破棄される前にMockDoesExist呼び出されます (プログラムの終了直前に破棄されます)。テスト ケース中にMockDoesExist::name、長い文字列が割り当てられます。MSVC の標準ライブラリには、短い文字列の最適化があります。つまり、各 std::string には、短い文字列を格納できる内部 16 バイトの char 配列があります。より長い文字列の場合のみ、フリー ストアからメモリを割り当てる必要があります。そのメモリは、文字列のデストラクタで解放されます。この場合、MockDoesExist::namegets が破棄されたとき、つまり_CrtMemDifferencegets が呼び出された後です。

于 2012-11-26T12:43:55.753 に答える
0

あなたが何か間違ったことをしているとは思いません。一度MockDoesExist::name破壊されると、報告された「メモリリーク」は消えます。

于 2012-11-26T12:43:10.940 に答える