Мы выполняем обновление с 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 кнопками утечка составляет 10 с. Мб.
Обратите внимание, чтоВыше приведен тестовый пример, в котором мы удалили весь наш код обработки диалогов, в нашем реальном коде у нас есть производный класс и мы используем 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;
}
Чего нам здесь не хватает?