Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Падает деструктор QWidget, или QObject 
:(
    Опции темы
Cristall512
Дата 21.5.2013, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



Всем привет!
Сразу скажу, что код выложить не могу. Проект большой очень, какой именно кусок выкладывать, даже не знаю. Знал бы - сам бы исправил.
После перехода на 5-е кути приложение стало падать при завершении. После App->exec() стоит delete mainWindow.
Код

    QPointer<QvMainWindow> mainWindow;

mainWindow содержит в себе несколько объектов. Деструкторы тех из них, которые унаследованы от QWidget, тоже падают. Отладчик не показывает, где именно падает деструктор, но похоже, что это происходит в деструкторе либо QWidget, от которого наследуется QvMainWindow, либо QObject. Понимаю, что телепатов здесь нет, но может, кто-то с таким сталкивался. Могут помочь разные варианты, почему может падать. Заранее спасибо!
PM MAIL   Вверх
Guinness
Дата 21.5.2013, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Cristall512 @  21.5.2013,  07:20 Найти цитируемый пост)
После App->exec() стоит delete mainWindow.

Зачем? Удалять QObject и его наследников таким образом не рекомендуется. Да и после завершения работы приложения удалять mainwindow, по идее, нет необходимости.
У Вас в классе используются QScopedPointer, QSharedPointer?

Это сообщение отредактировал(а) Guinness - 21.5.2013, 07:52
PM MAIL   Вверх
Cristall512
Дата 21.5.2013, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



QScopedPointer не используется точно, QSharedPointer - возможно, не знаю, проект по большей части писал не я, просто сейчас он оказался на мне.

Цитата

Удалять QObject и его наследников таким образом не рекомендуется.

А как рекомендуется?
PM MAIL   Вверх
Guinness
Дата 21.5.2013, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Cristall512 @  21.5.2013,  08:12 Найти цитируемый пост)
А как рекомендуется?

Если очень важно, то через deleteLater(). В Вашей ситуации не очень понятно зачем вообще это делать.
PM MAIL   Вверх
Cristall512
Дата 21.5.2013, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



через deleteLater не удаляется, не вызывается деструктор. Потому что после этого удаляется CoreApplication. Если и его удаляю deleteLater, проблеме не решается - снова падает. Зачем это нужно? Не знаю, я такое не писал. Говорят, деструкторе может быть сохранение состояния. Хотя я не уверен, что у нас оно есть (там куча наследников, все ещё не просмотрел), скорей всего, Вы правы, это вообще здесь не нужно.

Это сообщение отредактировал(а) Cristall512 - 21.5.2013, 09:03
PM MAIL   Вверх
Guinness
Дата 21.5.2013, 09:18 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Если у Вас нечто подобное:
Код

QApplication app;
/* code */
app.exec();
delete mainwindow;

Закомментируйте строчку с delete.
Цитата(Cristall512 @  21.5.2013,  08:12 Найти цитируемый пост)
 QSharedPointer - возможно, не знаю, проект по большей части писал не я, просто сейчас он оказался на мне.

Возможно, если объекту, расположенному в QSharedPointer, был присвоен parent, который удаляется раньше mainwindow, то может возникнуть ситуация, когда в деструкторе QSharedPointer удаляться уже удаленный объект.
PM MAIL   Вверх
Jeka178RUS
Дата 21.5.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Никогда не видел чтобы в main MainWindow создавался через new, обычно просто используется 
Код

QApplication app;
MainWindow mw;
/* code */
return app.exec();


Тогда и удалять руками никого не нужно
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1096 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.