ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

メモリリークした場所にブレークポイント

メモリリークしたメモリを作成している所がいろいろな場所から呼び出されているようなとき、それがどこから呼び出されたものか知りたいときは_CrtSetBreakAlloc関数を使えば良い。
Download Visual Studio 2005 Retired documentation from Official Microsoft Download Center
例えば_CrtDumpMemoryLeaks関数で次のようにメモリリークが見つかった場合、

Detected memory leaks!
Dumping objects ->
c:\test.cpp(7) : {112} normal block at 0x005F8048, 4 bytes long.
 Data: <    > 00 00 00 00 
Object dump complete.

この{}でくくられている数値はオブジェクトの割り当て順番番号。この数値を引数にして_CrtSetBreakAlloc関数を呼べば、そこでブレークしてくれる。上の例だと次のようになる。

_CrtSetBreakAlloc(112);

このコードを追加してプログラムを再び実行すれば、そのメモリを確保するタイミングでプログラムの実行が停止する。
もちろん、プログラムを実行するたびにメモリ確保の順番が変わるような場合はうまくいかない。