none
VisualStudio2012における、メモリリークの検知方法について RRS feed

  • 質問

  • はじめて投稿させていただきます。

    当方、VisualC++6.0にて作成、コンパイルされたC++プログラムを、

    VisualStudio2012にて、再コンパイルして同様の動作が可能かどうかテストを行っているのですが、

    再コンパイルし、テストを行ったところ以下のようなエラーが出るようになり、IEが落ちてしまうようになりました。

    ---------------- エラー内容ここから ----------------

     問題イベント名: APPCRASH
      アプリケーション名: iexplore.exe
      アプリケーションのバージョン: 8.0.7601.17514
      アプリケーションのタイムスタンプ: 4ce79912
      障害モジュールの名前: ntdll.dll
      障害モジュールのバージョン: 6.1.7601.17725
      障害モジュールのタイムスタンプ: 4ec49b60
      例外コード: c0000005
      例外オフセット: 00052cc7
      ・・・以下略・・・

    ---------------- エラー内容ここまで ----------------

    しかし、何度か繰返しテストを行っていると、うまく動作することもあります。

    おそらく、失敗するときはメモリリークを起こしているためで、

    成功の時はたまたま成功しているだけ、というところまで分ったのですが、

    メモリリークの原因箇所をどのように調査したらよいかわかりません。

    Webで調査したところ、デバッグ実行でメモリリーク箇所を特定する方法はいくつか見つけたのですが、

    C++プログラムをデバッグ実行しようとすると、「"プログラムの配置してあるパス".dllは実行できません。」

    とのエラーが出て、デバッグ実行することもできません。

    コンパイルしたプログラムをWeb実行した際に、メモリリークの原因箇所を特定する方法をご存知の方がいれば、

    アドバイスいただけたらと考えています。

    2013年7月22日 7:32

回答

  • おそらく、失敗するときはメモリリークを起こしているためで、

    成功の時はたまたま成功しているだけ、というところまで分ったのですが、

    メモリリークの原因箇所をどのように調査したらよいかわかりません。

    何を根拠にそのような判断をしたのでしょうか? メモリリークが発生した場合、その後、メモリ確保に失敗するだけでエラー処理が適切であれば落ちることはありません。

    また、メモリー確保を1回実行しただけであれば、1回確保されるだけですからメモリリークしていたとしてもリーク量はしれています。つまりメモリリークをするのはループのような複数回実行される個所でメモリー確保が行われるものの解放されていない場合のことを指します。

    まずはメモリリークにこだわらず、エラーの発生個所を突き止めるべきと思います。

    • 回答としてマーク noriaki_daeg 2013年7月22日 8:09
    • 回答としてマークされていない noriaki_daeg 2013年12月25日 5:18
    • 回答としてマーク noriaki_daeg 2013年12月25日 5:20
    2013年7月22日 7:55