LINUX.ORG.RU

Можно ли удалять QNetworkReply через deleteLater() и сразу присваивать указатель на новый объект?

 deletelater, , , ,


0

4

В коде у меня встречается такая конструкция:

void Downloader::onFileDownloadFinished(QNetworkReply *reply)
{
  ...
  // Если есть перенаправление
  if(!urlRedirectedTo.isEmpty())
  {
    QNetworkRequest request(urlRedirectedTo);

    networkReply->deleteLater(); // Напрямую удалять запрос нельзя, см. документацию
    networkReply=webManager.get(request); // Новый запрос
    reconnectSignalsNetworkReply(networkReply);
  }
  ...


Здесь вызов deleteLater() происходит при одном значении указателя networkReply, и сразу же значение указателя меняется.

То есть, метод webManager.get() создаст новый объект QNetworkReply, и указатель на него будет присвоен переменной networkReply.

Вопрос. Когда сработает deleteLater() для networkReply, то будет удаляться объект по старому указателю, или по текущему?

★★★★★

Вопрос. Когда сработает deleteLater() для networkReply, то будет удаляться объект по старому указателю, или по текущему?

По тому, на котором вызван deleteLater()

UVV ★★★★★
()

Когда сработает deleteLater(), ему будет всё равно, куда указывает твой указатель. Всё, что делает этот слот, это

void QObject::deleteLater()
{
    QCoreApplication::postEvent(this, new QDeferredDeleteEvent());
}

XMs ★★★★★
()
Ответ на: комментарий от annulen

Если отложенное удаление внутри объекта будет путем помещения this в очередь удаления, то вопросов нет.

Но если отложенное удаление внутри объекта будет по каким-то соображениям более извращенным, с каким-нибудь захватом значения указателя вверх по стеку, и запоминанием указателя на указатель, то тут дело не так однозначно.

Посему и спрашиваю.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от XMs

А, похоже что отложенное удаление тупо по this.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ты, похоже, так и не понял, что объект в C и C++, однажды родившись, не меняет свой адрес до самой смерти.

asaw ★★★★★
()
Ответ на: комментарий от Xintrea

this имеет тип T* или const T*, а не T*&, посему запомнить косвенную ссылку на объект при разименовании невозможно следуя стандарту языка. Прочитай уже какую-нибудь книжку по C++. Только прошу, до конца.

Dendy ★★★★★
()
Ответ на: комментарий от Xintrea

Но если отложенное удаление внутри объекта будет по каким-то соображениям более извращенным, с каким-нибудь захватом значения указателя вверх по стеку, и запоминанием указателя на указатель, то тут дело не так однозначно.

Как и в предыдущем вопросе: чтобы код Qt мог так работать, ему нужен указатель на указатель (или ссылка на указатель), а не только this.

annulen ★★★★★
()
Ответ на: комментарий от Dendy

Про this никто и не говорит. В сях столько возможностей выстрелить себе в ногу, что расчитвать на то, что T*& не приведётся к типу T* вообще не пристало.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.