今回の記事のサンプルは以前公開した
シーン制御のVS(CC++)版のmain.h,main.cppに書いてあります。
まず、方法ですが、結構簡単です
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#define malloc(p1) _malloc_dbg(p1,_NORMAL_BLOCK,__FILE__,__LINE__)
このコードを全てのソースで定義されるようにします。
ヘッダに書いて全てのソースでインクルードするとかが妥当ですかね
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF )
後はこのコードをプログラムの一番最初に書けばOKです
うまくいけばプログラム終了時に
VS(VC++)なら出力コンソールに、
dglibならDOS窓にリークしたメモリを確保したファイルと行を表示してくれます
と、これでうまくいけば万々歳なんですが、そうもいかないんです
defineでnewとmallocの定義を置き換えるので、これ以下の行でnewの定義などをしていれば、
もちろんエラーが出ます。
DirectXのd3d9.hなどではnewの定義をしています。
ということは、
このコードの下でd3d9.hなどをインクルードしていれば置き換えられてしまい、エラーがでてしまいます
なので、このコードを書くときはこのコードの下が
自作のソースファイル、ヘッダファイルになるようにしましょう。
そうすると、WinAPI,DirectXの内部で確保したメモリは検出はされますが、場所は出てこないので、そこは自分でやるしかなさそうです
何故こういうことになるのかなどの詳しい話は下記ページを参考にすると良いと思います。
Microsoftの関連ページ
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnvc60/htm/MemLeaks.asp
結構わかりやすく書かれています
http://frog.raindrop.jp/knowledge/archives/000258.html
さて、今回は簡単に紹介してみました
毎回メモリリークには結構悩むので、結構重宝しています
よく
_CrtDumpMemoryLeaks()ではリークが検出されて、
_CrtSetDbgFlag()関数では出てこないという事態があります
恐らくSTL系のものの開放がプログラム終了時なのでmain()関数内で_CrtDumpMemoryLeaks()をコールした場合に検出されてしまうのではと思っています
この辺はいまいち僕も曖昧ですね
すいません
とりあえず、今回はこの辺りで。
あでゅー
ノシ
PR
COMMENT