![]() |
|
![]() ![]() ![]() |
|
sustenuto |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 28.4.2011 Репутация: нет Всего: нет |
Здравствуйте! Я первый раз работаю с QT и столкнулся с проблемой, решение которой не смог найти в документации. Суть сводиться к тому, что не ясно, кто должен удалять объект, производный от QObject: я или библиотека QT. Оказывается, что оба случая работают неправильно: если я создаю объект как статическую переменную (которая удаляется автоматически во время завершения программы), либо если я создаю его динамически, оператором new, и не удаляю совсем. В первом случае я получаю Segmentation Fault, во втором — утечку памяти.
Мой класс описан примерно вот так:
Если объект LoadFileDialog сделать статической переменной, то при работе во время вызова его деструктора происходит Segmentation Fault. Если я объект не удаляю, то деструктор не вызывается вообще! Это я вижу, поскольку надписи "DIALOG DESTROYED!!!!" нет. Я предположил, что объект всё-таки уничтожается, но в силу того, что деструкторы QDialog и QWidget НЕ ВИРТУАЛЬНЫ (в отличие от деструктора QObject), вызывается неправильный деструктор. Друзья, как правильно делать? PS. Кстати, если у меня ещё что-нибудь неправильно в классе, скажите плиз. Буду благодарен) Это сообщение отредактировал(а) sustenuto - 29.5.2011, 19:43 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
на самом деле они виртуальные, т.к. при наследовании от QObject, где, как ты и сказал, деструктор виртуальный, их деструкторы (также, как и твой) становятся виртуальными. где именно ты создаёшь объект LoadFileDialog статически, и где динамически ? Выложи весь код ( не жалей винград ![]() Это сообщение отредактировал(а) borisbn - 29.5.2011, 19:31 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
sustenuto |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 28.4.2011 Репутация: нет Всего: нет |
borisbn, спасибо за ответ!
На самом деле, не совсем так. То есть если вызывается `delete dialog' где dialog имеет тип QDialog* (и фактически является объектом LoadFileDialog), то вызовется ~QDialog(). При этом `delete (QObject*)dialog' вызовет ~LoadFileDialog(). Я так понимаю.
Вроде бы максимально упростил код, ошибка сохраняется: 1. Статически. После закрытия окна получаю Segmentation Fault
2. Динамически. Деструктор ~LoadFileDialog() никогда не вызывается
|
||||||
|
|||||||
kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
А попробуй создавать не статически, а просто
-------------------- ![]() |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Когда ты создаёшь переменную так:
вместе с переменной dlg создаётся булевская переменная, по которой проверяется, создавался ли объект dlg. При первом вызове main() он будет создан. Деструктор dlg будет вызван перед завершением программы, т.е. после выхода из main(), перед которым был вызван деструктор app, что и вызывает ошибку. Нужно объявлять так:
В этом случае деструкторы будут вызывааться при выходе из main() в порядке, обратном объявлению. |
||||
|
|||||
sustenuto |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 28.4.2011 Репутация: нет Всего: нет |
Ага, спасибо! Только проблема в том, что объект надо создавать не в main, а в другой функции. Можно было бы делать QApplication app статическим, но у него нету конструктора по умолчанию((( Так что и этот вариант тоже не прокатывает( Решение проблемы я нашёл: создавать dialog динамически и затем выполнять
Тогда он удаляется корректно. Всем спасибо! |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Создай класс, производный от QApplication и сделай LoadFileDialog dlg; или LoadFileDialog* dlg; полем в этом классе. |
|||
|
||||
sustenuto |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 28.4.2011 Репутация: нет Всего: нет |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |