5

メモリリークに関して非常に奇妙な問題があります。リークのチェックには _CrtDumpMemoryLeaks を使用します。ここに私の WinMain 関数があります:

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

1 に答える 1

4

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

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

于 2012-11-14T15:57:19.290 に答える