メモリリーク…?

日曜は仕事で行き詰まってていろいろ調べたのでメモ。
資料が少なかったので参考になると幸。
 
状況としては、ソース的にはどう考えてもメモリリークしないのに、何故かどんどんメモリ使用量がどんどん増えていくという謎現象。
で、最初は思わぬところでリークしてるのかなと思って総ざらいしたけれど、やっぱりリークしていない。
よく分からないのでステップ実行で確認していきました。
このソースはDLLのなかでmalloc、realloc、freeする関数があって、本体からそれらを呼んでいるのだけれども、freeしたり、しないときがあったりで、その部分が異様に怪しいという考えに至りました。
 
で、デバッグでステップ実行しているうちにメモリを解放するところでエラーがががっ!
メッセージを見るとdbgheap.cファイルでExpression _CrtlsValidHeapPointer(pUserData)
が返ってくるらしいです。
で、これだけではよく分からないので(俺だけ?)、ネットで調べてみるとDLLと本体のmsvcrt.dllのランタイムライブラリが違うと動きが怪しくなるらしいとの事。
ついでにそこではコンパイルMFCの設定もどうやら怪しいとの事でそっちも見直す事にする。
 
結局俺の場合プロジェクトの設定のC/C++タブのコード生成のカテゴリで使用するランタイムがDLLと本体でバラバラで、片方はマルチスレッド(DLL,デバッグ)で、もう片方はマルチスレッド(DLL)でした。
あと、一般タブのMicrosoft Fundation Classが全部バラバラでこれも良くなかったみたいです。
ここら辺を全部同じにして実行してみるとリークは止まっているみたいでした。
 
この後もうちょっと調べたらmsvcrt.dllは[シングルスレッド、マルチスレッド、マルチスレッド(DLL)]*[リリース、デバッグ]の総計6パターンあるらしい…。
で、デバッグバージョンだとmallocとかでデバッグ用に要求されたサイズよりちょっと多めに確保するらしいです。
で、ランタイムがリリースとデバッグでバラバラだとそんな事気付かずに要求されたサイズだけを解放してたまっていったりエラーになったりするらしい。
うーん。
こんなの知らないと絶対分からない気がするんですが…。
 
まぁ、徹夜で調べていたのとか、解決してから2日ほど建ってるって言う事もあって正確では無いかもしれないけれども、大筋はあってると思います。
間違ってたらごめんなさい…。
とりあえず、似たような体験したときはチェックしてみるといいかも。
 
参考リンク:
http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00016278.shtml
http://www.s34.co.jp/cpptechdoc/misc/bug/dll/index.html