1

WPFアプリケーションで_CrtDumpMemoryLeaks()を呼び出すラッパークラスを作成しています。WPFアプリケーションにC言語のDLLを読み込んでいますが、WPFがDLLのテストアプリとしても機能しているため、DLLにメモリリークがあるかどうかを確認したいと思います。

class MemLeak
{
    static int _CRTDBG_ALLOC_MEM_DF   =  0x01;
    static int _CRTDBG_LEAK_CHECK_DF  =  0x20;        
    static int _CRTDBG_MODE_DEBUG     =  0x2;
    static int _CRTDBG_MODE_WNDW      =  0x4;
    static int _CRT_WARN              =  0;
    static int _CRT_ERROR             =  1;
    static int _CRT_ASSERT            =  2;

    [DllImportAttribute("msvcrtd.dll", EntryPoint = "_CrtDumpMemoryLeaks", SetLastError = true)]
    static extern int _CrtDumpMemoryLeaks();

    [DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetDbgFlag")]
    static extern int _CrtSetDbgFlag(int newFlag);

    [DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetReportMode")]
    static extern int _CrtSetReportMode(int reportType, int reportMode);

    public static void StartMemLeakLogging()
    {
        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
        _CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG);
    }

    public static void StopMemLeakLogging()
    {
        _CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);
        int i = _CrtDumpMemoryLeaks();
    }
}

Windows XPProfessionalSP3でVisualStudio2008SP1を使用しています。不思議なことに、システムがそれを見つけることができなかったので、私はmsvcrtd.dllファイルをダウンロードしなければなりませんでした。その後、それをデバッグフォルダにコピーするだけで、アプリケーションが動作を開始しました。ただし、DLLコードでメモリを意図的に割り当てて解放しなくても、デバッグ中に出力ウィンドウにメモリリーク情報が表示されません。

また、DLLのソースコードを変更することはできません。変更しないと、これらの関数をDLLのソースコードに入れようとします。MFCアプリケーションを作成してDLL関数を呼び出してみましたが、デバッグ中のMFCが内部でこの関数を呼び出している可能性があるため、_CrtDumpMemoryLeaks()を呼び出さなくても、MFCアプリケーションがメモリリークを検出し、出力ウィンドウに表示されます。 WPFテストアプリ。

4

1 に答える 1

0

動作しました。参考のために以下のリンク

http://social.msdn.microsoft.com/Forums/en/clr/thread/484de950-f488-452e-a9bf-b8b4cd2d1f75

于 2011-06-02T17:43:46.807 に答える