![]() |
|
|
![]()
|
|
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Создаю в конструкторе класса через new экземпляры QTemporaryFile и QSettings. Попытка удаления этих указателей происходит в деструкторе при выходе из программы, после чего я получаю краш. Полный текст программы в аттаче.
Присоединённый файл ( Кол-во скачиваний: 6 )
LJ3.zip 10,20 Kb |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
объекты библиотеки владеющие статическими данными (например QSettings) нельзя удалять после финализации QApplication.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Как оно может удаляться после, если класс Joiner агрегирован в класс QMainWindow. Я всегда думал, что сначала должны вызываться деструкторы всех окон, а уж потом выход из main loop'a. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
У вас же заканчивается приложение автоматически при закрытии окна ? т.е. при сигнале OnClose происходит выход из MainLoop.
Деструктор окна на этот момент не отработанный. Добавлено через 3 минуты и 58 секунд Для проверки перенесите код по удалению Joinera из деструктора в слот по сигналу OnClose |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
В общем мистика какая-то. Пытался установить окну аттрибут setAttribute(Qt::WA_DeleteOnClose, true);. Если главное окно создано в стеке (не через new), то имеем краш при выходе. Если через new, то все нормально за исключением того, что программа продолжает крашится на удалении QSettings, т.е. аттрибут не работает так как надо.
Если удалять в closeEvent, то удаление QSettings сначало проходило нормально, но крашилось на удалении QTemporaryFile. После некоторых экспериментов и возвращению опять к варианту с closeEvent программа снова начала крашится на удалении QSettings, при этом удаления QTemporaryFile указателя я вообще закомментировал, поставил флаг setAutoRemove(false) и удаляю указатель на временный файл до создания экземпляра QSettings. Хрень какая-то. Создаю через new QSettings, на следующей же строчке вызываю его delete - все ОК. Если же вызываю delete в деструкторе класса, то краш. Это сообщение отредактировал(а) SABROG - 30.9.2008, 13:02 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Без проблем, смотри аттач. Присоединённый файл ( Кол-во скачиваний: 5 )
LJ3.zip 10,39 Kb |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
Посмотрел.. на глаз вроде все в порядке (не могу проверить, так как нету QT). Единственное, что могу предложить: сделать в Joiner метод clear () (или UnInit() ), который будет очищать QList<fileinfo>, и вызывать его по closeEvent, a сам объект создавать на стеке.
Насколько я знаю, setAutoRemove устанавливает флаг удаления файла, при уничтожении объекта, а не указателя Это сообщение отредактировал(а) mes - 1.10.2008, 11:33 |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А он же в стеке создается, я его при всем желании удалить не смогу вручную:
Это я знаю, я просто его ставил, чтобы была возможность удалив указатель на QTemporaryFile не удалять при этом временный файл, чтобы QSettings могло его подгрузить. Плохо что нету Qt. Похоже придется подзабить на удаление указателей, программа хоть не крашится при выходе, да и утечки памяти быть не должно, т.к. программа будет запускаться время от времени и больше 3-4х копий QSettings там врятли будет. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
||||
|
||||
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А ну да, в принципе. Просто логику понять не могу, я же все-равно экземпляр класса Joiner создаю в конструкторе через new и удаляю в closeEvent. Т.е. по любому все объекты класса Joiner должны уничтожится до выхода из closeEvent. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
Чтоб исключить случай когда closeEvent приходит дважды.. )) Другого ничего в голову не приходит ) |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Исключил. Сначала оставил один MessageBox, чтобы понять вызовется он дважды или нет, а потом оставил clear(). Произошел краш все-равно. |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Проблема похоже здесь:
Сначала создается временный объект, в конструкторе выделяется указатель для QSettings. Далее конструктор копирования тупо хавает все члены класса и создает копию объекта. При выходе из области временный объект уничтожается, а вместе с ним вызывается деструктор в котором удаляется указатель, который теперь принадлежит двум экземплярам класса. При выходе из программы идет попытка удаления уже удаленного указателя. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 7 Всего: 250 |
||||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, 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. |