Здравствуйте!
Почему у диалогового класса нет деструтора? В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)? Если дописать деструктор, то объявлять ли его виртуальным?
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Почему у диалогового класса нет деструтора?
В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)?
Например в OnClose()
Re[2]: Почему у диалогового класса нет деструтора?
Здравствуйте Nikto, Вы писали:
N>Здравствуйте Constructor, Вы писали:
C>>Здравствуйте! C>>Почему у диалогового класса нет деструтора? N>В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)?
N>Например в OnClose()
Не совсем верный ответ. OnClose() вызывается только если закрывать диалог кнопкой закрытия окна в правом верхнем углу. А при закрытии кнопакми ОК и Отмена — не вызывается. Наверное, лучше OnDestroy().
Re[3]: Почему у диалогового класса нет деструтора?
Здравствуйте Constructor, Вы писали:
C>Здравствуйте Nikto, Вы писали:
N>>Здравствуйте Constructor, Вы писали:
C>>>Здравствуйте! C>>>Почему у диалогового класса нет деструтора? N>>В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)?
N>>Например в OnClose()
C>Не совсем верный ответ. OnClose() вызывается только если закрывать диалог кнопкой закрытия окна в правом верхнем углу. А при закрытии кнопакми ОК и Отмена — не вызывается. Наверное, лучше OnDestroy().
В яблочко! А зачем тогда спрашивал?
Re[4]: Почему у диалогового класса нет деструтора?
Здравствуйте Nikto, Вы писали:
N>Здравствуйте Constructor, Вы писали:
C>>Здравствуйте Nikto, Вы писали:
N>>>Здравствуйте Constructor, Вы писали:
C>>>>Здравствуйте! C>>>>Почему у диалогового класса нет деструтора? N>>>В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)?
N>>>Например в OnClose()
C>>Не совсем верный ответ. OnClose() вызывается только если закрывать диалог кнопкой закрытия окна в правом верхнем углу. А при закрытии кнопакми ОК и Отмена — не вызывается. Наверное, лучше OnDestroy().
N>В яблочко! А зачем тогда спрашивал?
Я был удивлен, почему нет деструктора у класса, наследованного от CDialog. Сначала немного растерялся. Мне интересно, почему я должен освобождать память в OnDestroy(), а не в деструкторе.
Re[5]: Почему у диалогового класса нет деструтора?
...
C>Я был удивлен, почему нет деструктора у класса, наследованного от CDialog. Сначала немного растерялся. Мне интересно, почему я должен освобождать память в OnDestroy(), а не в деструкторе.
А что значит нет деструктора? У класса CObject определен виртуальный деструктор и вроде как это гарантирует наличие деструктора у всех производных классов.
Сила, она в ньютонах
Re[3]: Почему у диалогового класса нет деструтора?
Здравствуйте Constructor, Вы писали:
C>Здравствуйте Nikto, Вы писали:
N>>Здравствуйте Constructor, Вы писали:
C>>>Здравствуйте! C>>>Почему у диалогового класса нет деструтора? N>>В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)?
N>>Например в OnClose()
C>Не совсем верный ответ. OnClose() вызывается только если закрывать диалог кнопкой закрытия окна в правом верхнем углу. А при закрытии кнопакми ОК и Отмена — не вызывается. Наверное, лучше OnDestroy().
Все выше описанное не то чтоб неверно, но нежелательно.
Например при следующем использовании:
CMyDialog dlg;
while(dlg.DoModal()!=IDOK);
конструктор будет вызван только один раз, а OnDestroy() может вызываться много раз. Результат думаю очевиден.
И вообще:
если выделяешь память в конструкторое — очищай в деструкторе
если выделяешь память в OnInitDialog() — очищай в OnDestroy().
Здравствуйте Constructor, Вы писали:
C>Здравствуйте! C>Почему у диалогового класса нет деструтора? В какой момент мне освобождать динамически выделенную память (например, при нажатии на кнопку выделяю кусок)? Если дописать деструктор, то объявлять ли его виртуальным?
Допиши деструктор ручками, и все. Виртуальным его объявлять необязательно (но если очень хочется, то можно), поскольку вполне достаточно того, что в базовом классе (CObject) деструктор объявлен виртуальным.