VC8からVC10にアップグレードしており、CDialogに関連していると思われるメモリリークが多数見つかりました。この最も簡単な例は、ボタンの数だけがあるCDialogを使用した次のコードで示されています。VC10ではこれはリークしますが、VC8ではリークしません。
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
delete dialog;
}
メモリ使用量は増え続けており、約30個のボタンを使用したダイアログの例では数十Mbがリークしています。
上記は、ダイアログ処理コードをすべて削除したテスト例であることに注意してください。実際のコードでは、派生クラスがあり、PostNcDestroy()を使用しています。
奇妙なことに、次のコード例はいずれもVC8でもVC10でもリークしません。
CDialog* dialog = new CDialog;
for (int i = 0; i < 5000; ++i) {
dialog->Create(IDD_LEAKER, 0);
dialog->DestroyWindow();
}
delete dialog;
for (int i = 0; i < 5000; ++i) {
CDialog* dialog = new CDialog;
delete dialog;
}
ここで何が欠けていますか?