crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Вызов деструкторов при наследовании
Rocky
  опции профиля:
сообщение 7.2.2010, 21:25
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Всем привет!

Я все про кнопки )). Решил добавить к круглым овальным) кнопкам треугольные )). Решил через наследование все это организовать. Вот такой вот код:

class CCustomButton : public QPushButton
{
    Q_OBJECT

protected:
    CCustomButton(QWidget *pParent);
    CCustomButton(const QString& sText, QWidget *pParent = 0);
    virtual ~CCustomButton();

protected:
..........
}



class CRoundButton : virtual public CCustomButton
{
    Q_OBJECT

public:
    CRoundButton(QWidget *pParent);
    CRoundButton(const QString& sText, QWidget *pParent = 0);
    ~CRoundButton();
........
}



class CTriangleButton : virtual public CCustomButton
{
    Q_OBJECT

public:
    CTriangleButton(QWidget *pParent);
    CTriangleButton(const QString& sText, QWidget *pParent = 0);
    ~CTriangleButton();
.........
}


Ну вот положил на форму пару кнопок, сделал им promote to CRoundButton и CTriangleButton. Все работает, все хорошо... Но меня смущает очень сильно одна вещь. При выходе из программы не вызываются деструкторы объектов этих кнопок... Программа вроде память не жрет.. но непонятно как так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.2.2010, 22:18
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 8.2.2010, 0:25) *
При выходе из программы не вызываются деструкторы объектов этих кнопок... Программа вроде память не жрет.. но непонятно как так?
при выходе из программы ОСь сама память освобождает.
А вот как ты определил, что деструкторы не вызываются это интересно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 7.2.2010, 22:22
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


нужно везде передавать QWidget *pParent, во всех конструкторах, например:
CCustomButton::CCustomButton(QWidget *pParent)
  : QPushButton(pParent) {
//...
}

и так для всех конструкторов твоих классов
если ты так и делаешь, значит не удаляется тот pParent который передается в конструктор, соответственно и его дети(child) - твои CCustomButton, тоже не удаляются
и виртуальным деструктор делать не надо:
virtual ~CCustomButton();

ибо если в QPushButton он виртуальный то в этом нету надобности, а если не виртуальный возможны косяки, пока незнаю какие..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 7.2.2010, 22:33
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


ну как )) просто написал там что-то типа int z = 0; и поставил брэйкпоинт. И не провалился туда, поэтому и вопросы возникли..

А по-поводу ОСи... а вот если бы я например в этом классе создавал динамический массив (в стиле С) и соответсвенно память освобождал бы в деструкторе, тогда ведь утечки бы возникли? Кстати надо проверить... Или QT настолько умная, что сама все знает и делает? Просто еслибы по каким-то причинам невызывался бы деструктор в программе, написанной на MFC, там были бы большие проблемы.

Цитата(DIMEDROLL @ 7.2.2010, 22:22) *
нужно везде передавать QWidget *pParent, во всех конструкторах, например:

так и делаю. Я даже специально убрал "== 0" чтобы именно задавать парента. Щас проверил - нулевой родитель нигде не передается.

Цитата(DIMEDROLL @ 7.2.2010, 22:22) *
и виртуальным деструктор делать не надо:

А как тогда? Если отвлечься от QT. Если родитель базового класса не виртуальный, то при удалении ребенка (а он удаляется в первую очередь) деструктор родителя просто не вызовется. Или нет =( Да не вроде так. Ну это в случае полиморфизма...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 7.2.2010, 22:37
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Rocky @ 7.2.2010, 22:25) *
А по-поводу ОСи... а вот если бы я например в этом классе создавал динамический массив (в стиле С) и соответсвенно память освобождал бы в деструкторе, тогда ведь утечки бы возникли? Кстати надо проверить... Или QT настолько умная, что сама все знает и делает? Просто еслибы по каким-то причинам невызывался бы деструктор в программе, написанной на MFC, там были бы большие проблемы.

Не было бы никаких проблем, при закрытии процесса вся память возвращается системе, не зависимо от того, делал ты delete/free.
Что бы отработали деструкторы кнопок, нужно что бы сработал деструктор окна, которому они принадлежат.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 7.2.2010, 22:37
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


просто пока конечно нигде у меня такого нет, но вдруг нужно будет написать что-то типа
CCustomButton *p = new CRoundButton()

и лучше бы тогда деструктор CCustomButton был виртуальным.. Вобщем, седня перед сном почитаю Страуструпа. Ощущения что я что-то забыл (

Сообщение отредактировал Rocky - 7.2.2010, 22:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 7.2.2010, 22:40
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


Цитата(Rocky @ 7.2.2010, 21:33) *
А как тогда? Если отвлечься от QT. Если родитель базового класса не виртуальный, то при удалении ребенка (а он удаляется в первую очередь) деструктор родителя просто не вызовется. Или нет =( Да не вроде так. Ну это в случае полиморфизма...

проверил, QObject имеет виртуальный деструктор, значит надобности писать в своем CCustomButton нету

у тебя не удаляется парент твоих классов, поэтому и не вызывается деструктор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 7.2.2010, 22:42
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(BRE @ 7.2.2010, 22:37) *
Не было бы никаких проблем, при закрытии процесса вся память возвращается системе, не зависимо от того, делал ты delete/free.

ну это при выходе из программы.. А если какой-то объект часто создается/уничтожается.. тогда ведь и получаем memory leaks. Если ресурсы которые он взял при своем создании корректно не освободились при его уничтожении.

Цитата
Что бы отработали деструкторы кнопок, нужно что бы сработал деструктор окна, которому они принадлежат.

Стало быть он не срабатывает?... У этих кнопок куча виджетов-предков... Завтра попробую тестовый пример тогда написать и погонять
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 7.2.2010, 22:45
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Rocky @ 7.2.2010, 22:37) *
и лучше бы тогда деструктор CCustomButton был виртуальным

Деструктор виртуальный еще от QObject.
Насчет писать/не писать virtual для таких деструкторов, это личное дело "писателя", хоть пиши/хоть не пиши деструктор будет виртуальным. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 7.2.2010, 22:49
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(BRE @ 7.2.2010, 22:45) *
Деструктор виртуальный еще от QObject.

Чесгря я как-то видимо стороной прошел... А почему он виртуальный? Из-за того что определен макрос Q_OBJECT? Просто ни разу не слышал чтобы виртуальность деструктора наследовалась...

Сообщение отредактировал Rocky - 7.2.2010, 22:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 12:04