我有一个大问题,我实际上认为我解决了它。我有一个使用 QNetworkAccessManager 的应用程序。这个 QNAM 位于一个类中。当我在这个 QNAM 上执行请求时,所有这些请求都在一个包装器中完成,该包装器包含回复并对其进行重试逻辑
例如,如果我在构造函数中有一个 putBlob(它继承自 baseRequest),我会传递一个对 QNAM 的引用。我在它上面执行请求并保存一个指向回复的指针。然后回复将是包装子,因此 QNAM 不再拥有它的所有权。包装器是持有 QNAM 的原始类的子级。
类有一个 QNAM,和子“putBlobRequest”,它有子“QNetworkReply*”
现在的问题是当用户想要取消应该删除主对象及其中的所有内容时。包装器还应该中止它的 QNetworkReply 并断开连接(这样它就不会调用 finish())
我在 baseRequest 上的析构函数(它包含 QNetworkReply 并且是它的父级)如下所示:
if(_reply) {
if(_reply->isRunning()) {
_reply->disconnect(SIGNAL(finished()));
_reply->disconnect(SIGNAL(uploadProgress(qint64, qint64)));
_reply->abort();
}
}
当包装器在持有它的类中被杀死时,删除就完成了。(对吗?)
这有时有效,但有时我会遇到巨大的访问冲突,并且所有内容都因以下调用堆栈而崩溃:
QtCored4.dll!QObject::disconnect(const QObject * sender, const char * signal, const QObject * receiver, const char * method) Line 2891 + 0x8 bytes C++
QtNetworkd4.dll!QNetworkReplyImpl::abort() Line 874 + 0x18 bytes C++
FrameworkAzure.dll!BaseRequest::~BaseRequest() Line 129 + 0xa bytes C++
FrameworkAzure.dll!PutBlobRequest::~PutBlobRequest() Line 24 + 0x5e bytes C++
FrameworkAzure.dll!PutBlobRequest::`scalar deleting destructor'() + 0xb bytes C++
FrameworkAzure.dll!AzureBlobStorageProvider::~AzureBlobStorageProvider() Line 41 + 0xa8 bytes C++
所以首先 abort() 被调用,它调用以下内容:
if (d->outgoingData)
disconnect(d->outgoingData, 0, this, 0); <--- we go in here
这将我带到 QOBject.cpp 中的第 2891 行:
const QMetaObject *smeta = sender->metaObject();
它因错误而崩溃的地方:
CloudSync.exe 中 0x66c2c490 (QtCored4.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xdddddddd。
地址“0xdddddddd”是“发送者”。
为什么发送者对象不可读?我究竟做错了什么?请帮忙!
编辑:
也试过:
if(_reply) {
if(_reply->isRunning()) {
disconnect(_reply, SIGNAL(finished()), this, SLOT(handleFinishedRequest()));
_reply->abort();
}
}
我还断开了导出的 putBlob 中的 uploadProgress。也尝试过不断开连接,但同样的问题是违反了“发件人”