Qt- QNetworkReply удалить оператор - Runtime Crash - PullRequest
1 голос
/ 03 мая 2011

В моем приложении Qt я использую QNetworkAccessManager в потоке, чтобы мой основной поток был свободен для выполнения своей задачи. Для каждой операции get, которую я выполняю, я сохраняю QNetworkReply * в списке, а после ответа извлекаю его из своего списка, удаляю запись в списке и вызываю deleteLater () для объекта QNetworkReply *. Однако, после нескольких запросов / ответов здесь происходит сбой, который я получаю во время выполнения:

Код, который я использовал:

void NetworkManager::responseFromServer(QNetworkReply* pReply)
{

  // Retrieve the TileRequestMessage.
  QImage *pImage = imageMapper.value(pReply);
  // Get the bytes from the response.
  QByteArray byteArray = pReply->readAll();
  // Load the QImage with the data.
  bool loaded = pImage->loadFromData(byteArray);

  // Remove the request from book-keeping.
  imageMapper.remove(mapIterator.key());
  pReply->deleteLater();
  return;
}

где pImage - указатель на объект типа QImage. Объект создается заранее, и его указатель, сопоставленный с QNetworkReply *, сохраняется в QMap.

Я получаю ошибку:

Остановлено на 0x637837aa (оператор delete) в потоке 1 (отсутствует отладочная информация). sException at 0x637837aa, код: 0xc0000005: нарушение прав чтения на 0xffffffffcdcdcdc1, флаги = 0x0

Стек вызовов:

0 оператор delete MSVCR90D 0 0x637837aa
1 QList :: node_destruct qlist.h 418 0x64071704
2 QList :: free qlist.h 744 0x6407153b
3 QList :: ~ QList qlist.h 718 0x64070b1f
4 QQueue :: ~ QQueue qqueue.h 58 0x6407076f
5 QNetworkReplyImplPrivate :: handleNotifications qnetworkreplyimpl.cpp 358 0x6406c99d
6 QNetworkReplyImpl :: event qnetworkreplyimpl.cpp 868 0x6406e646
7 QApplicationPrivate :: notify_helper qapplication.cpp 4445 0x6507153e
8 QApplication :: notify qapplication.cpp 3845 0x6506f1ba
9 QCoreApplication :: notifyInternal qcoreapplication.cpp 732 0x671c2fb1
10 QCoreApplication :: sendEvent qcoreapplication.h 215 0x671c8159
11 QCoreApplicationPrivate :: sendPostedEvents qcoreapplication.cpp 1373 0x671c3f0b
12 qt_internal_proc qeventdispatcher_win.cpp 506 0x67206bf9
13 IsThreadDesktopComposited USER32 0 0x77bb86ef
14 IsThreadDesktopComposited USER32 0 0x77bb8876
15 IsThreadDesktopComposited USER32 0 0x77bb89b5
16 DispatchMessageW USER32 0 0x77bb8e9c
17 QEventDispatcherWin32 :: processEvents qeventdispatcher_win.cpp 807 0x67207b96
18 QEventLoop :: processEvents qeventloop.cpp 150 0x671c0abe
19 QEventLoop :: exec qeventloop.cpp 201 0x671c0bf0
20 QThread :: exec qthread.cpp 490 0x670643d6
21 DispatcherThread :: run DispatcherThread.cpp 226 0x1001031a
22 QThreadPrivate :: start qthread_win.cpp 317 0x6706852f
23 beginthreadex MSVCR90D 0 0x636edff3
24 beginthreadex MSVCR90D 0 0x636edf89
25 BaseThreadInitThunk kernel32 0 0x77191194
26 RtlInitializeExceptionChain ntdll 0 0x77ccb429
27 RtlInitializeExceptionChain ntdll 0 0x77ccb3fc

Я использую msvc для компиляции моего кода Qt. Любой хедз-ап о том, в чем может быть проблема ??

Спасибо

Вишну.

Ответы [ 2 ]

0 голосов
/ 03 мая 2011

Просто идея:

Поскольку вы используете deleteLater (), вы не знаете, когда произойдет удаление и, следовательно, когда указатель QNetworkReply * может оказаться недопустимым в вашем списке.

Таким образом, возможно попробуйте обернуть ваш указатель в защищенный указатель ( QPointer ), а затем просто удалите его из списка, если он удален / пуст.Если это все еще действительный указатель, вы вызываете deleteLater ();

0 голосов
/ 03 мая 2011

Не глядя на ваш реальный код и основываясь на описании ошибки, возможно, вы удаляете QNetworkReply до того, как он испустит сигнал finished. Таким образом, после удаления, когда новые данные становятся доступными - QNetworkReply испускает сигнал readyRead, когда он пытается получить доступ к уже удаленной записи и, следовательно, возникает ошибка «нарушение прав чтения».

...