メモリリークのメモリ確保場所を特定するには

解説

1.まとめ

Visual C++ 2005 (Visual Studio 2005) を使用した、「メモリリークのメモリ確保場所の特定」に関してまとめます。
より正しくは、Visual C++ 2005 (Visual Studio 2005) の出力ウィンドウに「検出したメモリリークのメモリ確保場所のソースファイル名、行番号をダンプする方法」に関してまとめます。
「メモリリークを検出するには」も同時に実施する必要があります)

「メモリ確保関数をデバッグバージョンの関数に置き換える定義」をソースファイルの先頭に記述すると、検出したメモリリークのメモリ確保場所のソースファイル名、行番号が出力ウィンドウにダンプされるようになります。
ただし、この方法による「メモリリークのメモリ確保場所を特定」は、デバッグバージョンの場合(プリプロセッサの定義で _DEBUG が定義されている場合)にしか機能しません。(_DEBUG が未定義の場合、デバッグバージョンのメモリ確保関数は、通常バージョンのメモリ確保関数の呼び出しに変わるため)

出力ウィンドウに検出したメモリリークのメモリ確保場所のソースファイル名、行番号がダンプされていない例



出力ウィンドウに検出したメモリリークのメモリ確保場所のソースファイル名、行番号がダンプされている例

2.「new を DEBUG_NEW に置き換える定義」のあるソースファイル

Visual C++ 2005 によって「new を DEBUG_NEW に置き換える定義」が挿入されているソースファイルは、
・C++のメモリ確保関数である new に関しては、特別なプログラミングをしなくても、検出したメモリリークのメモリ確保場所のソースファイル名、行番号がダンプされます。
・Cのメモリ確保関数である malloc系の関数に関しては、「メモリ確保関数をデバッグバージョンの関数に置き換える定義」をソースファイルの先頭に記述すると、検出したメモリリークのメモリ確保場所のソースファイル名、行番号がダンプされるようになります。

3.「new を DEBUG_NEW に置き換える定義」のないソースファイル

「new を DEBUG_NEW に置き換える定義」のないソースファイルは、
C++のメモリ確保関数である new に関しても、Cのメモリ確保関数である malloc系の関数に関しても、「メモリ確保関数をデバッグバージョンの関数に置き換える定義」をソースファイルの先頭に記述すると、検出したメモリリークのメモリ確保場所のソースファイル名、行番号がダンプされるようになります。
(デバッグバージョンのメモリ確保関数を利用するために、crtdbg.h のインクルードも記述します)

ダウンロード

CFooクラスオブジェクトとFOO構造体オブジェクトのメモリリークのメモリ確保場所の特定のサンプルプロジェクト

サンプルプロジェクト(SpecifyMemoryLeakMfc)

サンプルプロジェクト(SpecifyMemoryLeakWin)

サンプルプロジェクト(SpecifyMemoryLeakConsole)