MS documentation (и others) «ясно» гласит:CDialog - EndDialog из диалога MODELESS?
... Поскольку нормальные функции-члены OnOK и OnCancel объекта CDialog бы назвать EndDialog, убедитесь, что ваш немодальным диалоговое окно делает не назвать тех, функции и вместо переопределяет
Поскольку CDialog::OnOk
эффективно вызывает CDialog::EndDialog
, и этот метод выглядит следующим образом:
void CDialog::EndDialog(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
EndModalLoop(nResult);
::EndDialog(m_hWnd, nResult);
}
мы можем также проверить the docs for ::EndDialog
что опять-таки "ясно" состояние:
диалоговые окна, созданные DialogBox, DialogBoxParam, DialogBoxIndirect и функции DialogBoxIndirectParam должны быть уничтожены с помощью функции EndDialog. Приложение вызывает EndDialog из процедуры диалога; функция не должна использоваться для любых других целей.
Тем не менее, у меня есть производный класс CDialog
, который имеет поведение по умолчанию. OnOK
и , казалось бы, все работает, когда я использую его немодальным/немодальным.
То есть: * Когда я закрываю (немодальное) диалоговое окно, оно закрывается/удаляется из представления. * Приложение не обнаруживает утечек памяти. (Сборка отладки MFC)
И что? Нужно ли мне предотвращать EndDialog
и звонить DestroyWindow
сам или нет?
Примечание: Я знаю, что говорят документы и «сеть». Это просто, что я еще не нашел , почему Мне нужно сделать это по-другому, и этот один класс должен использоваться для немодального и модального режима, поэтому не нужно делать что-либо другое, может быть удобно.
Я подозреваю, что вы просачиваетесь в окно. Это не будет выглядеть как утечка памяти в вашем приложении, потому что окна поддерживаются системой. Проверьте столбец «USER objects» в диспетчере задач, чтобы узнать, растет ли значение с течением времени. – arx