0

ヒープデバッグを有効にして、メモリリークエラーをデバッグしようとしました。私は以下を含めることによってそうします:

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

_CrtDumpMemoryLeaks()関心のある関数での呼び出しと一緒に。

次に、プロジェクトプロパティの構成を編集して、デバッグタイプをに設定し'Native Only'、プリプロセッサ定義'_DEBUG'とC /C++コード生成ランタイムライブラリを追加します/MDd。関数呼び出しをどこに置いても_CrtDumpMemoryLeaks()、次のようにメモリリーク出力がダンプされることがわかりました。

Detected memory leaks!
Dumping objects ->
{2606} normal block at 0x000000003D3A5370, 32 bytes long.
 Data: <VAR1> 54 48 45 52 4D 41 4C 5F 43 4F 4E 44 55 43 54 49 
{2605} normal block at 0x000000003D3A52E0, 32 bytes long.
 Data: <VAR2> 52 4F 43 4B 5F 48 45 41 54 5F 43 41 50 41 43 49 
{2604} normal block at 0x000000003D3A5250, 32 bytes long.
 Data: <VAR3> 45 51 55 49 4C 49 42 52 41 54 49 4F 4E 5F 52 45 
{2603} normal block at 0x000000003D3A51C0, 32 bytes long.
 Data: <VAR4> 4D 41 58 5F 57 41 54 45 52 5F 43 41 50 49 4C 4C 
{2602} normal block at 0x000000003D3A5130, 32 bytes long.
 Data: <VAR5> 4D 41 58 5F 47 41 53 5F 43 41 50 49 4C 4C 41 52 
{2601} normal block at 0x000000003D3A50A0, 32 bytes long.
 Data: <VAR6> 57 41 54 45 52 5F 43 4F 4D 50 52 45 53 53 49 42 
{2600} normal block at 0x000000003D3A5000, 48 bytes long.

これはどういう意味ですか?呼び出しの時点でダンプ出力があった場合、その前にエラー/リークが実際に発生することを意味しますか?確かにそれを結論付けることができますか?そうでなければ、それは本当に便利なユーティリティではないようです。正しく使用する方法や解釈に関するアドバイス/ヘルプをいただければ幸いです。ありがとう!

4

1 に答える 1

1

次のペアがあるとします。

int *x = new int[5];
int *y = new int[7];

delete[] y;
_CrtDumpMemoryLeaks();
delete[] x;

後で削除してxも、ダンプはx解放されていないものとして含まれます。実際、標準的な MS 手法には、メモリ管理を理解する高度なスキルが必要でした。あなたの生活を簡素化するために、私のお勧めはVisual Leak Detectorです。これは、プロジェクトに簡単に埋め込み、エラーを簡単に見つけることができます (しかも無料です)。

于 2012-06-14T16:29:11.663 に答える