none
_CrtDumpMemoryLeaks()関数でメモリーリークを監視するには RRS feed

  • 質問

  • _CrtDumpMemoryLeaks()関数にて

    、メモリーリークを監視しておりますが、以下のコードでメモリーリークを監視するには。

    どのようにするのでしょうか。return文の後に書くわけにもいかず悩んでおります。

    ご教授受けたく質問しました。

    よろしくお願いいたします。

    VC2010EE, Windows7:64bit

    //-----------------------------------------------------------------------------
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>
    #include <iostream>
    using namespace std;
    //-----------------------------------------------------------------------------
    class test
    {
     int *i;
    public:
     test() :i(new int()) {}
     ~test() {cout << "delete object" << endl; delete i;}
    };
    //-----------------------------------------------------------------------------
    int main()
    {
     static test a;
     _CrtDumpMemoryLeaks();//この時点では当然メモリは確保されている
     return 0;
     _CrtDumpMemoryLeaks();//ここでは関数そのものが実行されない
    }
    //-----------------------------------------------------------------------------

    2012年3月20日 5:00

回答

  • main関数ローカル変数のデストラクタ呼出し後なら、おそらく atexit() でできると思います。

    しかし、例示のような静的インスタンスデストラクタ後に実行するのは普通なら無理じゃないですかね?

    デバッグ版専用機能であることから main() の実行後に処理する必要性は非常に低い気がします。

    Visual Studio の実行環境なら通常は無記述で出力されますから何を行いたいのか気になりますね・・・・。

    • 回答としてマーク Sura4849 2012年3月20日 7:23
    2012年3月20日 6:20

すべての返信

  • main関数ローカル変数のデストラクタ呼出し後なら、おそらく atexit() でできると思います。

    しかし、例示のような静的インスタンスデストラクタ後に実行するのは普通なら無理じゃないですかね?

    デバッグ版専用機能であることから main() の実行後に処理する必要性は非常に低い気がします。

    Visual Studio の実行環境なら通常は無記述で出力されますから何を行いたいのか気になりますね・・・・。

    • 回答としてマーク Sura4849 2012年3月20日 7:23
    2012年3月20日 6:20
  • ご回答有難うございます。

    あれからよく調べてみましたが、_CrtDumpMemoryLeaks()関数を使うよりメイン関数内の一番最初に

    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    と加えることで、問題は解決できました。

    これを以て、解決と致します。

    2012年3月20日 7:23
  • なるほど コンソールアプリ では、指定しないとレポート出力してくれないのですね・・・。

    参考になりました。

    2012年3月20日 8:15