Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу удалить QTemporaryFile и QSettings 
:(
    Опции темы
SABROG
  Дата 29.9.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Создаю в конструкторе класса через new экземпляры QTemporaryFile и QSettings. Попытка удаления этих указателей происходит в деструкторе при выходе из программы, после чего я получаю краш. Полный текст программы в аттаче.

Код

class fileInfo
{
public:
    fileInfo(const QString &filename)
    {
        QFile file(filename);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            throw interpreter_exception(QObject::tr("Can't open file!").toStdString());
        }
        QByteArray bytes = file.readAll();
        bytes.replace('\\', "\\\\");
        tempfile = new QTemporaryFile();
        if(!tempfile->open())
        {
            delete tempfile;
            throw interpreter_exception(QObject::tr("Can't create temp file!").toStdString());
        }
        tempfile->write(bytes);
        //QMessageBox::information(0, "Temp file", tempfile.fileName());
        settings = new QSettings(tempfile->fileName(), QSettings::IniFormat);
    }
    ~fileInfo()
    {
        delete settings;
        delete tempfile;
    }
    quint8 hotels, rooms, places, meals;
private:
    QTemporaryFile *tempfile;
    QSettings *settings;
};


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  LJ3.zip 10,20 Kb


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 29.9.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



объекты библиотеки владеющие статическими данными  (например QSettings)  нельзя  удалять после финализации QApplication.




--------------------
PM MAIL WWW   Вверх
SABROG
Дата 29.9.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @ 29.9.2008,  16:52)
объекты библиотеки владеющие статическими данными  (например QSettings)  нельзя  удалять после финализации QApplication.

Как оно может удаляться после, если класс Joiner агрегирован в класс QMainWindow. Я всегда думал, что сначала должны вызываться деструкторы всех окон, а уж потом выход из main loop'a.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 29.9.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



У вас же заканчивается приложение автоматически при закрытии окна ? т.е. при сигнале OnClose происходит выход из MainLoop.
Деструктор окна на этот момент не отработанный.

Добавлено через 3 минуты и 58 секунд
Для проверки перенесите код по удалению Joinera из деструктора  в слот по сигналу OnClose 


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.9.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.9.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.9.2008,  12:26 Найти цитируемый пост)

Если удалять в closeEvent, то удаление QSettings сначало проходило нормально

Чудес не бывает  smile .. а можете выложить пример , как Вы это делали ? 

Это сообщение отредактировал(а) mes - 30.9.2008, 15:57


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.9.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @ 30.9.2008,  15:57)
Цитата(SABROG @  30.9.2008,  12:26 Найти цитируемый пост)

Если удалять в closeEvent, то удаление QSettings сначало проходило нормально

Чудес не бывает  smile .. а можете выложить пример , как Вы это делали ?

Без проблем, смотри аттач.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  LJ3.zip 10,39 Kb


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 1.10.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.9.2008,  17:39 Найти цитируемый пост)
Без проблем, смотри аттач.

Посмотрел.. на глаз вроде  все в порядке (не могу проверить, так как нету QT). Единственное, что могу предложить:
сделать в Joiner метод clear () (или UnInit() ), который будет очищать QList<fileinfo>, и вызывать его по closeEvent, a сам объект создавать на стеке.
Цитата(SABROG @  30.9.2008,  12:26 Найти цитируемый пост)
QTemporaryFile указателя я вообще закомментировал, поставил флаг setAutoRemove(false) 

Насколько я знаю, setAutoRemove устанавливает флаг удаления файла, при уничтожении объекта, а не указателя  smile 

Это сообщение отредактировал(а) mes - 1.10.2008, 11:33


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 1.10.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @  1.10.2008,  11:33 Найти цитируемый пост)
и вызывать его по closeEvent, a сам объект создавать на стеке.

А он же в стеке создается, я его при всем желании удалить не смогу вручную:

Код

bool Joiner::appendFile(const QString &filename)
{
    fileList << fileInfo(filename);
    return true;
}


Цитата(mes @  1.10.2008,  11:33 Найти цитируемый пост)
setAutoRemove устанавливает флаг удаления файла

Это я знаю, я просто его ставил, чтобы была возможность удалив указатель на QTemporaryFile не удалять при этом временный файл, чтобы QSettings могло его подгрузить.

Плохо что нету Qt. Похоже придется подзабить на удаление указателей, программа хоть не крашится при выходе, да и утечки памяти быть не должно, т.к. программа будет запускаться время от времени и больше 3-4х копий QSettings там врятли будет.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 1.10.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  1.10.2008,  11:47 Найти цитируемый пост)
А он же в стеке создается, я его при всем желании удалить не смогу вручную:

a QList::clear () ?

Это сообщение отредактировал(а) mes - 1.10.2008, 11:53


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 1.10.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @ 1.10.2008,  11:53)
Цитата(SABROG @  1.10.2008,  11:47 Найти цитируемый пост)
А он же в стеке создается, я его при всем желании удалить не смогу вручную:

a QList::clear () ?

А ну да, в принципе. Просто логику понять не могу, я же все-равно экземпляр класса Joiner создаю в конструкторе через new и удаляю в closeEvent. Т.е. по любому все объекты класса Joiner должны уничтожится до выхода из closeEvent.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 1.10.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  1.10.2008,  12:32 Найти цитируемый пост)
Просто логику понять не могу, 

Чтоб исключить случай когда closeEvent приходит дважды.. )) Другого ничего в голову не приходит )


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 1.10.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(mes @ 1.10.2008,  12:47)
Цитата(SABROG @  1.10.2008,  12:32 Найти цитируемый пост)
Просто логику понять не могу, 

Чтоб исключить случай когда closeEvent приходит дважды.. )) Другого ничего в голову не приходит )

Исключил. Сначала оставил один MessageBox, чтобы понять вызовется он дважды или нет, а потом оставил clear(). Произошел краш все-равно.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 1.10.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Проблема похоже здесь:

Код

fileList << fileInfo(filename);


Сначала создается временный объект, в конструкторе выделяется указатель для QSettings. Далее конструктор копирования тупо хавает все члены класса и создает копию объекта. При выходе из области временный объект уничтожается, а вместе с ним вызывается деструктор в котором удаляется указатель, который теперь принадлежит двум экземплярам класса. При выходе из программы идет попытка удаления уже удаленного указателя.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 1.10.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  1.10.2008,  17:35 Найти цитируемый пост)
Проблема похоже здесь:

точно  smile 


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

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

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


 




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


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

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