在头文件中添加QString后堆积损坏

时间:2012-04-22 21:47:55

标签: c++ qt qstring heap-corruption

我最近得到了一个我以前从未得过的非常奇怪的错误。就在演示之前,我对我的代码进行了一些小改动。在代码中我有一个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个左右的文件中有几千行,我不知道它崩溃的地方,因为我没有得到堆栈跟踪,而且似乎每次都是随机出现的)

0 个答案:

没有答案