2012-11-14 17 views
5

メモリリークに非常に奇妙な問題があります。私はリークをチェックするために_CrtDumpMemoryLeaksを使用します。ここに私のWinMain関数は次のとおりです。奇妙な "メモリリーク検出"エラーC++

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, 
        _In_opt_ HINSTANCE hPrevInstance, 
        _In_ LPTSTR lpCmdLine, 
        _In_ int  nCmdShow) 
{ 
    UNREFERENCED_PARAMETER(hPrevInstance); 
    UNREFERENCED_PARAMETER(lpCmdLine); 

    ////////////////// SET UP CHECKS FOR MEMORY LEAKS //////////////////// 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    ////////////////////////////////////////////////////////////////////// 


    _CrtDumpMemoryLeaks(); // Reports leaks to stderr 

    return 0; 
} 

あなたが見ることができるように、私は多分、私は誤報のいくつかの種類を取得する場合だけで確認することから、完全にすべてを削除しました。

私がアプリケーションを閉じた後、私は出力にメモリリークのこの束を得る:

Detected memory leaks! 
Dumping objects -> 
{1343} normal block at 0x06076780, 8 bytes long. 
Data: < g  > 20 67 07 06 00 00 00 00 
{1342} normal block at 0x06076710, 52 bytes long. 
Data: <@ @ @  > 40 16 07 06 40 16 07 06 40 16 07 06 01 00 CD CD 
{1341} normal block at 0x060766B0, 32 bytes long. 
Data: <C:/Windows/Fonts> 43 3A 2F 57 69 6E 64 6F 77 73 2F 46 6F 6E 74 73 
{1339} normal block at 0x0607F438, 16 bytes long. 
Data: <    P > C0 17 0B 01 01 00 00 00 01 00 00 00 80 13 50 04 
{1338} normal block at 0x04501380, 8 bytes long. 
Data: < H > BC 0D 0B 01 48 18 07 06 
{1295} normal block at 0x060716B0, 8 bytes long. 
Data: <  > B4 B3 0B 01 00 00 00 00 
{1294} normal block at 0x06071640, 52 bytes long. 
Data: < g g g  > 10 67 07 06 10 67 07 06 10 67 07 06 01 01 CD CD 
{1293} normal block at 0x0450DFB8, 8 bytes long. 
Data: < ! P > E0 21 0B 01 98 05 50 04 
{1292} normal block at 0x0450E110, 8 bytes long. 
Data: < P  > E8 05 50 04 00 00 00 00 
// (There's like thousand more of those...) 
Object dump complete. 

私は完全に彼らから来るのか見当がつかない。

お返事ありがとうございます。

答えて

4

[出力]ウィンドウを確認します。たくさんのDLLがロードされていますか?いずれも、リーク出力を呼び出す前に解放されていないデータ構造を静的に初期化している可能性があります。 hereのヒントを試して、漏れチェックを実行時間の特定の範囲に設定して、そのノイズの一部を除外してください。

静的に初期化されたGoogle Testシングルトンはヒープに割り当てが必要なため、Visual C++メモリリークディテクタはプログラムの実行終了時にメモリリークを報告します。これを避ける最も簡単な方法は、_CrtMemCheckpointおよび_CrtMemDumpAllObjectsSince呼び出しを使用して、静的に初期化されたヒープオブジェクトを報告しないことです。詳細およびヒープチェック/デバッグルーチンの追加については、MSDNを参照してください。

+0

回答ありがとう、スティーブ! :-) –

+0

あなたのことを考えなければならないまで、あなたはこのような時間の窓を捉えることができるのか知らなかった –