我最近得到了一个我以前从未得过的非常奇怪的错误。就在演示之前,我对我的代码进行了一些小改动。在代码中我有一个QNetworkReply,我决定开始保存响应,而不是仅仅解析它的错误(这是一个基类,从现在开始,其中一个派生类需要Azure的响应才能执行GET方法)
我做的是:
class BaseRequest : public QObject {
Q_OBJECT
protected:
QPointer<QNetworkReply> _reply; //responsible but not owner
QString _responseBody;
...
}
在.cpp中我做了:
void BaseRequest::handleFinishedRequest() {
_responseBody = QString(_reply->readAll());
if(_reply->error() == QNetworkReply::NoError) {
this->handleSuccessfulRequest();
_reply->deleteLater();
return;
}
...
int action = _parser->evaluateResponse(_responseBody);
}
这个我现在正在保存我将要回来的xml,以便每个派生类中不同的handleSuccessfulRequest
可以处理responseBody,如果他们愿意的话。
然后我运行了这个应用程序,在我几次运行后,我收到了错误:
Windows已在x.exe中触发了断点。
这可能是由于堆损坏,这表明Graphics.exe或其加载的任何DLL中存在错误。
这也可能是因为用户在x.exe有焦点时按下F12。
输出窗口可能包含更多诊断信息
我之前从未见过这个错误,它出现了大约3次。然后我删除了我所做的更改并重新进行了修改。然后问题停止了(我想),我不知道如何处理这个问题。
阅读完这个问题: Of Memory Management, Heap Corruption, and C++ 我以为我可能与QString有关,但是如何?是的,它所属的请求是一个堆对象,而不是直接的QString。这可能仍然是问题,还是只是一个巧合,错误才开始出现?
此外,响应所属的请求就像我在堆上所说的那样,但是被智能指针(QScopedPointer)处理,每次我收到新请求时都会重置。我没有任何原始指针,除了可能一个,我无法找到任何我可能使用坏索引访问的数组。还有什么其他原因? (对不起,我不能提供更多的代码,但它在60个左右的文件中有几千行,我不知道它崩溃的地方,因为我没有得到堆栈跟踪,而且似乎每次都是随机出现的)