MFCネタ。Windowsアプリケーションを作成していると、ときどきメモリリークが発生することがある。さてどのコードか分からない。そんなときにおすすめなのがCMemoryStateクラス。
例えばこんな感じ。
CMemoryState hereMem;
hereMem.Checkpoint();
// メモリリークが発生していそうななんかの処理
CMemoryState thereMem;
thereMem.Checkpoint();
CMemoryState checker;
if (checker.Difference(hereMem, thereMem))
{
// hereとthereで相違があったみたい。
// アウトプットウインドウへ出力してみる。
checker.DumpStatistics();
}
という具合。
ちょっとおっちょこちょいな例としては、
関数の中のメモリリークを探してみようとして、
関数ブロックの先頭と終端にCheckpoint()を設定しちゃった場合。
void CSample::Function()
{
CMemoryState oldMem;
oldMem.Checkpoint();
char szBuf[BUFSIZ];
CMemoryState newMem;
newMem.Checkpoint();
CMemoryState checker;
if (checker.Difference(oldMem, newMem)) {
}
}
ローカル変数は関数を抜けてから解放されます。つまり関数にいる間はメモリが確保された状態になります。なので一瞬リークしたように感じます。
そんなときは、
CSample cSample;
CMemoryState oldMem;
oldMem.Checkpoint();
cSample.Function();
CMemoryState newMem;
newMem.Checkpoint();
CMemoryState checker;
if (checker.Difference(oldMem, newMem)) {
}
このように呼び出し元で関数をくくった方が良いです。その後で関数の中に入るなりして、範囲を狭めていくと良いのではないでしょうかね。慌てず騒がず粛々と進めましょう。