2015-11-27 1 views
0

У меня есть приложение с довольно большим количеством окон, каждый из которых отличается от класса CDialog.MFC: кнопка закрытия окна нажата; оконный объект не разрушен

Мое приложение отлично работало в течение многих лет, называя delete this от PostNcDestroy(), но теперь, когда я оглядываюсь, я не вижу никаких доказательств, которые бы ни были правильными или необходимыми. Каков правильный способ избавиться от моего CDialog -subclassed объекта?

+0

Как вы создаете ваши окна? Показать код. –

+0

> Как вы создаете свои окна? Показать код. У меня есть фреймворк с заводским методом, который открывает окна с именем класса в тексте. Существует общий базовый класс, основанный на CDialog, который, в свою очередь, выводит все мои окна. (Он поддерживает такие вещи, как сериализация рабочей области, позволяя пользователям настраивать, как будут устанавливаться окна при первоначальном открытии, перемещение элементов управления для изменения размера окна и т. Д.). Но в конечном итоге он просто вызывает новый класс. Этот базовый класс вызывает Create() с идентификатором ресурса подкласса. Мне интересно, является ли Create() перед конструкциями подкласса проблемой. –

ответ

0

Если диалог не нужен, то вызов delete this; в PostNcDestroy является обычным способом его выполнения.

См: https://support.microsoft.com/en-us/kb/103788

Вы должны быть особо осторожны, чтобы не получить доступ к оборванных указатель после того, как диалог увольте.

, например, мы делаем что-то вроде этого:

void CMainFrame::DoSomething() 
{ 
    MyModelessDialog* p = new MyModelessDialog; 
    p->Create(IDD_MODELESS_DIALOG, ...); 
} 

/// ... 
void MyModelessDialog::PostNcDestroy() 
{ 
    __super::PostNcDestroy(); // call base class to do clean up before deleting. 
    delete this; 
} 
Смежные вопросы