Да, это утечка памяти в вашем случае, но вы можете избежать утечки памяти в случаях, когда немодальное диалоговое окно выделено в куче, используя переопределение PostNcDestroy
.
Диалоги не предназначены для автоматической очистки (где окна основного кадра, окна просмотра).
Если вы хотите обеспечить автоматическую очистку для диалогов, вы должны переопределить функцию-член PostNcDestroy
в своем производном классе. Чтобы добавить автоматическую очистку в ваш класс, позвоните в базовый класс, а затем выполните delete this
. Чтобы удалить автоочистку из вашего класса, вызовите CWnd::PostNcDestroy
напрямую вместо PostNcDestroy
члена вашего прямого базового класса.
void MyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
Как это работает (из MSDN):
При уничтожении окна Windows
последнее сообщение Windows, отправленное
окно является WM_NCDESTROY. По умолчанию
CWnd обработчик для этого сообщения
(CWnd :: OnNcDestroy) отсоединит
HWND из объекта C ++ и вызвать
виртуальная функция PostNcDestroy. Немного
классы переопределяют эту функцию на
удалить объект C ++.
"удалить это" освободит любой C ++
память, связанная с объектом C ++.
Хотя по умолчанию CWnd
деструктор вызывает DestroyWindow, если
m_hWnd не NULL, это не приводит
до бесконечной рекурсии, так как ручка
будет отсоединен и NULL во время
фаза очистки.
Вы также можете обратиться к MSDN ( Уничтожение оконных объектов ) для получения дополнительной информации.
Примечание:
Это работает для немодального диалога, который можно выделить в куче .