Вызов деструкторов при наследовании |
Здравствуйте, гость ( Вход | Регистрация )
Вызов деструкторов при наследовании |
Rocky |
7.2.2010, 21:25
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Всем привет!
Я все про кнопки )). Решил добавить к круглым овальным) кнопкам треугольные )). Решил через наследование все это организовать. Вот такой вот код:
Ну вот положил на форму пару кнопок, сделал им promote to CRoundButton и CTriangleButton. Все работает, все хорошо... Но меня смущает очень сильно одна вещь. При выходе из программы не вызываются деструкторы объектов этих кнопок... Программа вроде память не жрет.. но непонятно как так? |
|
|
Litkevich Yuriy |
7.2.2010, 22:18
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
DIMEDROLL |
7.2.2010, 22:22
Сообщение
#3
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
нужно везде передавать QWidget *pParent, во всех конструкторах, например:
и так для всех конструкторов твоих классов если ты так и делаешь, значит не удаляется тот pParent который передается в конструктор, соответственно и его дети(child) - твои CCustomButton, тоже не удаляются и виртуальным деструктор делать не надо:
ибо если в QPushButton он виртуальный то в этом нету надобности, а если не виртуальный возможны косяки, пока незнаю какие.. |
|
|
Rocky |
7.2.2010, 22:33
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
ну как )) просто написал там что-то типа int z = 0; и поставил брэйкпоинт. И не провалился туда, поэтому и вопросы возникли..
А по-поводу ОСи... а вот если бы я например в этом классе создавал динамический массив (в стиле С) и соответсвенно память освобождал бы в деструкторе, тогда ведь утечки бы возникли? Кстати надо проверить... Или QT настолько умная, что сама все знает и делает? Просто еслибы по каким-то причинам невызывался бы деструктор в программе, написанной на MFC, там были бы большие проблемы. нужно везде передавать QWidget *pParent, во всех конструкторах, например: так и делаю. Я даже специально убрал "== 0" чтобы именно задавать парента. Щас проверил - нулевой родитель нигде не передается. и виртуальным деструктор делать не надо: А как тогда? Если отвлечься от QT. Если родитель базового класса не виртуальный, то при удалении ребенка (а он удаляется в первую очередь) деструктор родителя просто не вызовется. Или нет =( Да не вроде так. Ну это в случае полиморфизма... |
|
|
BRE |
7.2.2010, 22:37
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
А по-поводу ОСи... а вот если бы я например в этом классе создавал динамический массив (в стиле С) и соответсвенно память освобождал бы в деструкторе, тогда ведь утечки бы возникли? Кстати надо проверить... Или QT настолько умная, что сама все знает и делает? Просто еслибы по каким-то причинам невызывался бы деструктор в программе, написанной на MFC, там были бы большие проблемы. Не было бы никаких проблем, при закрытии процесса вся память возвращается системе, не зависимо от того, делал ты delete/free. Что бы отработали деструкторы кнопок, нужно что бы сработал деструктор окна, которому они принадлежат. |
|
|
Rocky |
7.2.2010, 22:37
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
просто пока конечно нигде у меня такого нет, но вдруг нужно будет написать что-то типа
и лучше бы тогда деструктор CCustomButton был виртуальным.. Вобщем, седня перед сном почитаю Страуструпа. Ощущения что я что-то забыл ( Сообщение отредактировал Rocky - 7.2.2010, 22:43 |
|
|
DIMEDROLL |
7.2.2010, 22:40
Сообщение
#7
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
А как тогда? Если отвлечься от QT. Если родитель базового класса не виртуальный, то при удалении ребенка (а он удаляется в первую очередь) деструктор родителя просто не вызовется. Или нет =( Да не вроде так. Ну это в случае полиморфизма... проверил, QObject имеет виртуальный деструктор, значит надобности писать в своем CCustomButton нету у тебя не удаляется парент твоих классов, поэтому и не вызывается деструктор |
|
|
Rocky |
7.2.2010, 22:42
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Не было бы никаких проблем, при закрытии процесса вся память возвращается системе, не зависимо от того, делал ты delete/free. ну это при выходе из программы.. А если какой-то объект часто создается/уничтожается.. тогда ведь и получаем memory leaks. Если ресурсы которые он взял при своем создании корректно не освободились при его уничтожении. Цитата Что бы отработали деструкторы кнопок, нужно что бы сработал деструктор окна, которому они принадлежат. Стало быть он не срабатывает?... У этих кнопок куча виджетов-предков... Завтра попробую тестовый пример тогда написать и погонять |
|
|
BRE |
7.2.2010, 22:45
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Rocky |
7.2.2010, 22:49
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
|
|
|
Текстовая версия | Сейчас: 2.1.2025, 18:00 |