6

私はプログラミングに不慣れではありませんが、C++には不慣れです。言語を演奏したり、言語と対話したりすると、物事をよりよく学ぶことができます。だから私が見つけたクールなことの1つは、VisualStudioにプログラムのメモリリークを次の方法で警告させる方法でした。

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> 

その後、電話します

_CrtDumpMemoryLeaks();

プログラムが終了し、すべてのメモリリークが出力ウィンドウに出力される前に、すばらしいです。

私の質問は

  • メモリリークを見つけた後、Visual Studio 2012を再起動する必要がありますか?
  • コンピューターを再起動する必要がありますか?
  • これらのものはどれくらい漏れたままですか?または、Windowsは実行の最後にすべてのメモリをクリーンアップしますか?それが本当なら、Visual Studioで「デバッグモード」でプログラムを実行することは本当ですか?

はい、私は本当に、、などのようなスマートポインターを使用する必要があることを知ってshared_ptrいますunique_ptrが、これは学習のために意図的に行っています。これは「本物の」アプリではなく、サンドボックステストだけです。

また、メモリリークを見つけるこの方法は、リークを_CrtDumpMemoryLeaks ()正確に見つけられない状況がありますか?素晴らしいツールのようです!

4

1 に答える 1

11

いいえ、メモリ リークはプログラムにあります。VS またはデバッガーは、デバッグ対象が終了すると、リークしたメモリとは何の関係もありません。カーネル メモリでない限り、すべてのユーザー モード メモリ割り当ては、プロセスの終了時に OS によって解放されます。

多くの場合、_CrtDumpMemoryLeaks は役に立ちません。1 回は、カーネル メモリのリークです (多くの場合、ハンドル リークとみなされ、Windows では他のツールが必要になります)。WinDbg および GFlags などの関連ツール (Microsoft の Web サイトから無料で入手できる Debugging Tools for Windows パッケージから) を調べて、より徹底的な診断メモリ リーク/ヒープ破損などを確認することをお勧めします。

于 2013-01-28T02:51:03.777 に答える