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