0

ブーストユニットテストについて学んでいますが、メモリリークを検出できることがわかったので、テストしています。私は次の恐ろしい方法を作成しました:

int ForTest::Compare(const ForTest item)
{
    ForTest* existing_item = this;
    char* x=new char[1024];
    m_name = std::string(x);
    if (existing_item->m_count * existing_item->m_price == item.m_count * item.m_price) return 0;
    if (existing_item->m_count * existing_item->m_price > item.m_count * item.m_price) return 1;    
    return -1;
}
BOOST_AUTO_TEST_CASE( a_test_case)
{
    BOOST_TEST_CHECKPOINT("weird...");

    ForTest alpha("Pen", 4, 4.3);
    ForTest beta;

    BOOST_CHECK_EQUAL(alpha.Compare(beta), 1);  
}

私は明らかにここで2つのメモリリークを作成しています。テスターが気にしないのはなぜですか?私のテストは飛んでいる色で合格します。

ここで見たように、実際のコードを変更する必要はありません:http ://www.boost.org/doc/libs/1_35_0/libs/test/example/exec_mon_example.cpp

エラーが発生しないのはなぜですか?

4

1 に答える 1

0

ブーストについてはよくわかりませんが、Visual Studioのデバッグヒープマネージャーを機能させるには、次のように記述する必要があります。

#include <crtdbg.h>

#ifdef _DEBUG
static char THIS_FILE[] = __FILE__;
#define new new( _NORMAL_BLOCK, THIS_FILE, __LINE__ )
#endif

int main()
{
    _CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) );
    new int(2036427631); // deliberate leak
}

リークするため、DEBUGバージョンの出力は次のようになります。

Detected memory leaks!
Dumping objects ->
d:\fun\try\try.cpp(11) : {66} normal block at 0x00345C40, 4 bytes long.
 Data: <okay> 6F 6B 61 79 
Object dump complete.
The program '[3216] try.exe: Native' has exited with code 0 (0x0).

おそらく、ブーストはメモリリークを検出するためにまったく同じことを使用します。

Visual Studioの「デバッグヒープマネージャー」はRELEASEバージョンでは機能しないため、RELEASEバージョンはメモリリークを検出しません。彼らがそれを「デバッグヒープマネージャー」と名付けた理由は何だと思いますか?

于 2012-10-12T17:39:57.193 に答える