2012-04-24 6 views
0

すべて、これらのコードのVisual Studioでメモリリークを検出する良い方法やツールを教えてもらえますか?私は、crtデバッグをテストしたが、私はデバッグプロセス(シフト+ f5)を中断している間、メモリリークレポートdoesnotは、デバッグウィンドウに表示されません。このコードのメモリリークを検出する方法を見つけるには?

void fun1() 
{ 
    int * pInt = new int; 
    return; 
} 
void Execute(void) 
{ 
    while(true) 
    { 
     cout<<"I will sleep for 1 second..."<<endl; 
     ::Sleep(1000); 
     fun1(); 
    } 
    return; 
} 
int main() 
{ 
    Execute(); 
    return 0; 
} 

上記のコードのメモリを見つける方法を知っている人はいますか? 私がshared_ptrを使用することを選択した場合、メモリリークは再び発生しません。

+4

完全な質問を読んでいないので、 'delete pInt;'を返すのを待っています... –

+0

'new'文が1つしかないので、メモリリークは見つけにくいはずです:P – orlp

+0

あなたはどのように「プロセスを中止しますか? CRTは、通常のプロセスシャットダウン時にチェックを実行する可能性があります.- while(true)を有限ループに変更してプロセスを終了させるとどうなりますか? –

答えて

0

これをメイン関数の上部に追加するのは機能しませんか?

#if defined(DEBUG) | defined (_DEBUG) 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
#endif 

デバッグモードで実行する必要があります。

-1

私はVSについて考えていませんが、Linuxではvalgrindを使用します。

+3

これは、なぜVSのリーク検出フックがここでトリガーしないのかという質問です。 –

+0

さて、g ** gleに尋ねると、この[MSDNページ](http://msdn.microsoft.com/en-us/library/e5ewb1h3(v = versus90).aspx)のコメントに特に注意してくださいC + +の 'new'のために何をしなければならないかを説明しています。 –

+0

VS2010の類似したページには、「operator new」のための別個の '#define'があります。 –

1

ここでの問題はかなり簡単です:プロセスを中断すると、メモリの漏れは当然のことです。たとえあなたのコードが通常漏れていなくても、デバッガで中断しても、とにかくメモリがリークすることになる。そのため、通常はメモリリークを報告するツールのほとんどは、デバッガでプログラムを中止しても機能しません。

このように、リークレポートを見るには、デバッガで強制終了するのではなく、ある時点で終了するコードを書く必要があります。あなたはこのような何かにあなたのコードを変更した場合:ところで

void fun1() 
{ 
    int * pInt = new int; 
    return; 
} 
void Execute(void) 
{ 
    for (int i=0; i<100000; i++) 
    { 
     //cout<<"I will sleep for 1 second..."<<endl; 
     //::Sleep(2000); 
     fun1(); 
    } 
    return; 
} 
int main() 
{ 
    Execute(); 
    return 0; 
} 

あなたはSleepにパラメータとして2000を渡すとき、あなたは1つだけでなく、それは少なくとも2秒をスリープ状態に期待するべきです。現時点では、私はcoutSleepをコメントアウトしていますので、すぐにメモリをリークしてリークレポートを作成する必要があります。多くの出力と睡眠で、それは同じことをするでしょう、ちょっとだけゆっくりと騒々しい。

+0

私は個人的な経験から、Memory Validatorが漏れなどのことを報告することを知っています。したがって、使用するツールによって異なります。 – StarPilot

0

問題は、プロセスが実行されている間に、自動プロセスがどのメモリがリークしたかを知ることが難しいことです。オブジェクトやメモリブロックへの参照をいつでも追跡できる言語では、参照を持たないブロックを見つけるだけで済みます。 C/C++では、あなたがそれを自分で実装しない限り、そのようなことはありません。したがって、メモリブロックが漏洩しているかどうかは実際には分かりません。

このような場合にできることの1つは、リークのないプロセスのライフサイクルのある時点でメモリリークをダンプする機能をトリガーすることです。たとえば、Execute()whileループで各繰り返しの最後にアプリケーションでリークが発生しないようにしているとします。そして、あなたはこのような何かを行うことができます:

#include <crtdbg.h> 

void fun1() 
{ 
    int * pInt = new int; 
    return; 
} 
void Execute(void) 
{ 
    int i = 0; 
    while(true) 
    { 
     cout<<"I will sleep for 1 second..."<<endl; 
     ::Sleep(2000); 
     fun1(); 

     #ifdef _DEBUG 
     // dump any leaks every 100 iterations 
     if (++i % 100 == 0) 
      _CrtDumpMemoryLeaks(); 
     #endif 
    } 
    return; 
} 
int main() 
{ 
    Execute(); 
    return 0; 
} 

は_CrtDumpMemoryLeaks()とMSVC CRTライブラリのその他の機能については、this pageを参照してください。

こちらがお役に立てば幸いです。

関連する問題