1

在我的 Qt 应用程序中,我在线程中使用 QNetworkAccessManager 以使我的主线程可以自由地执行其任务。对于我执行的每个 get 操作,我将 QNetworkReply* 存储在一个列表中,并在响应时从我的列表中检索它,删除列表中的条目并在 QNetworkReply* 对象上调用 deleteLater()。但是,经过几个请求/响应后,我在运行时遇到了崩溃:

我使用的代码是:

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 中。

我得到的错误是:

在线程 1 中的 0x637837aa(操作员删除)处停止(缺少调试信息)。sException 在 0x637837aa,代码:0xc0000005:读取访问冲突:0xffffffffcdcdcdc1,标志 = 0x0

调用栈是:

0 运营商删除 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::~064070Private.h 558
:: handleNotifications qnetworkreplyimpl.cpp 358 0x6406c99d
6 QNetworkReplyImpl ::事件qnetworkreplyimpl.cpp 868 0x6406e646
7 QApplicationPrivate :: notify_helper qapplication.cpp 4445 0x6507153e
8的QApplication ::通知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 ::开始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 代码。任何提示可能是什么问题?

谢谢,

毗湿奴。

4

2 回答 2

0

如果不查看您的实际代码并根据您的错误描述,您可能会在 QNetworkReply 发出finished信号之前删除它。因此,在新数据可用时删除后 - QNetworkReply 发出readyRead信号,该信号将尝试访问已删除的条目,因此出现“读取访问冲突”错误。

于 2011-05-03T09:46:22.497 回答
0

只是一个想法:

由于您使用 deleteLater() 您不知道删除何时发生,因此指针 QNetworkReply* 可能在您的列表中无效。

因此,也许尝试将您的指针包装在一个保护指针(QPointer)中,然后如果它已删除/为空,则将其从列表中删除。如果它仍然是一个有效的指针,你调用 deleteLater();

于 2011-05-03T10:39:07.087 回答