CWinApp::m_pszProfileNameはdeleteじゃなくfreeする

MFCアプリでiniファイルの書き出しがうまくいかない現象に悩んでいました。その現象自体はiniファイルのパスをフルパスで指定することで解決したのですが(Vista以降で起こるUACがらみの挙動が影響しているらしい)、今度はプログラム終了時にヒープが壊れて文句をいわれるようになってしまいました。

MFCアプリでiniファイルのパスを指定するのはCWinAppのm_pszProfileNameに値を設定します。ここでm_pszProfileNameに直接文字列リテラルのポインタを代入していたのがだめな原因でした。C++とすっかりご無沙汰だったせいで結構初歩的なところでボロボロです。悔しいですw

■間違い

m_pszProfileName = _T("d:\\temp\\test.ini");

■正解

if (m_pszProfileName) {
    free((void*)m_pszProfileName);
}
m_pszProfileName = _tcsdup(_T("d:\\temp\\test.ini"));