Russian Qt Forum
Ноябрь 23, 2024, 20:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] последовательное удаление и создание QNetworkAccessManager  (Прочитано 7357 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Июнь 08, 2012, 20:36 »

Здравствуйте. Добавил в приложение простенькую проверку обновлений: если с сайта1 нужная информация не была получена, то читаем с сайта2. Вот приблизительный код (класс выкинут):
Код
C++ (Qt)
QNetworkAccessManager *_qnam;
 
void checkUpdatesFromUrl(const QUrl &url)
{
   _qnam = new QNetworkAccessManager;
   connect(_qnam, SIGNAL(finished(QNetworkReply *)), SLOT(networkReplyFinished(QNetworkReply *)));
   _qnam->get(QNetworkRequest(url));
}
 
void networkReplyFinished(QNetworkReply *reply)
{
   QByteArray webpage = reply->readAll();
   reply->deleteLater();
   _qnam->deleteLater();
 
   QRegExp rx(QString("%1 v(.+)<\\/a>").arg(qApp->applicationName()));
   rx.setMinimal(true);
   if (rx.indexIn(webpage) != -1)
   {
       // всё ок - версия найдена
   }
   else
   {
       QUrl newUrl("сайт2");
       if (newUrl != reply->url())
           checkUpdatesFromUrl(newUrl);
   }
}
...
checkUpdatesFromUrl("сайт1");
Вопрос: не будет ли утечки памяти из-за _qnam, если управление переходит в else и там вызывается checkUpdatesFromUrl(newUrl)? Если да, то как это можно исправить (создавать _qnam в конструкторе я не хочу т.к. он мне больше нигде не нужен)?
« Последнее редактирование: Июль 28, 2012, 09:10 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июнь 08, 2012, 21:05 »

не будет. Ты же указал, что старый объект нужно удалить, он и удалится немного погодя.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Июнь 08, 2012, 21:14 »

спасибо. я думал, что раз _qnam потом начнет указывать на новый объект, то возможно старый "потеряется" и удален не будет. значит Qt сохраняет указатели на удаляемые таким образом объекты в каком-то списке/словаре и очищает этот контейнер когда "придет время"?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июнь 08, 2012, 21:44 »

не будет. Ты же указал, что старый объект нужно удалить, он и удалится немного погодя.
Ещё как будет.

я думал, что раз _qnam потом начнет указывать на новый объект, то возможно старый "потеряется" и удален не будет.
Правильно думал.
Записан

Qt 5.11/4.8.7 (X11/Win)
alexis031182
Гость
« Ответ #4 : Июнь 08, 2012, 21:53 »

Объясните, пожалуйста, почему не будет удалён? Событие об удаление объекта поместится в очередь событий. А то что происходит рекурсивный вызов функции, так там всего лишь указатель подменится, но старый объект останется существовать до наступления события удаления.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Июнь 08, 2012, 22:29 »

не будет. Ты же указал, что старый объект нужно удалить, он и удалится немного погодя.
Ещё как будет.

Ну чесслово Улыбающийся

Код
C++ (Qt)
class O : public QObject
{
   Q_OBJECT
 
   public:
       O() : QObject()
       {
           qDebug("+O");
       }
 
       ~O()
       {
           qDebug("-O");
       }
};
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   O *o;
 
   o = new O;
   o->deleteLater();
 
   o = new O;
   o->deleteLater();
 
   o = new O;
   o->deleteLater();
 
   return app.exec();
}
 

Внимание, вопрос: сколько будет на экране "+O" и "-O"?
« Последнее редактирование: Июнь 08, 2012, 22:35 от Alex Custov » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Июнь 08, 2012, 22:34 »

спасибо. я думал, что раз _qnam потом начнет указывать на новый объект, то возможно старый "потеряется" и удален не будет. значит Qt сохраняет указатели на удаляемые таким образом объекты в каком-то списке/словаре и очищает этот контейнер когда "придет время"?

я сперва даже не понял, думал что речь о чём-то другом, но ребят, как вам не стыдно? Улыбающийся Указатель на объект - это не сам объект. Факт наличия или отсутствия указателя на существующий объект в памяти абсолютно не влияет на него, это не Java. Всё что делает метод deleteLater() - посылает отложенное событие самому себе (объекту), и он делает самоубийство через delete this;
« Последнее редактирование: Июнь 08, 2012, 22:40 от Alex Custov » Записан
alexis031182
Гость
« Ответ #7 : Июнь 08, 2012, 23:21 »

Классно затролено ))
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Июнь 09, 2012, 00:07 »

Указатель на объект - это не сам объект. Факт наличия или отсутствия указателя на существующий объект в памяти абсолютно не влияет на него, это не Java.
да, это я знаю Улыбающийся
Всё что делает метод deleteLater() - посылает отложенное событие самому себе (объекту), и он делает самоубийство через delete this;
теперь все ясно. спасибо за объяснение.

кстати тот код не компилируется если не выбросить Q_OBJECT - ругается на отсутствующую vtable, а main.moc не генерируется.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Июнь 09, 2012, 00:10 »

кстати тот код не компилируется если не выбросить Q_OBJECT - ругается на отсутствующую vtable, а main.moc не генерируется.

надо добавить в конец файла
Код:
#include "main.moc"
если имя исходного файла main.cpp, это я не скопировал.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Июнь 09, 2012, 00:15 »

точно, спасибо. но там и без Q_OBJECT все работает как надо.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Июнь 09, 2012, 07:13 »

я сперва даже не понял, думал что речь о чём-то другом, но ребят, как вам не стыдно? Улыбающийся
Посыпаю голову пеплом. Стыдно Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 22.