首页| 论坛| 消息
主题:QNetworkReply 崩溃,非法访问
介农酥发表于 2019-12-25 14:51
我的程序一到中午就崩溃,我发现内存在不断的加,后来知道是因为QNetworkAccessManager管理的QNetworkReply内存需要释放,我做了试验,在finished的信号deleterLater,然后置nullptr,确实可以防止内存泄漏,但是我不知道为什么,我在finished信号槽中访问reply会崩溃,finished槽中reply难道还会NULL。我只能在finished信号对应的槽中加一个判断
    if (!reply) {
        return;
    }

但是我网上和官网的看的几个例子,好像没有先判断这个reply是不是非法。如果非法,我之前没有deleterLater和置nullptr的时候,怎不见得崩溃。

程序说明如下,这个QNetworkAccessManager在异步请求的时候,还会有其他请求,所以,本次finished响应不一定是本次请求发出的,可能是它后一个请求。关键代码如下:
    reply = manager->get(request);
    connect(reply, SIGNAL(finished()), this, SLOT(httpRead()));

void ZT::httpRead()
{
//非要加个reply是否空的判断吗?
    if (!reply) {
        return;
    }
    if (reply->error()) {
        //错误直接返回,因为连条码都没有
        qDebug() deleteLater();
        reply = nullptr;
        return;
    }
......
    reply->deleteLater();
    reply = nullptr;
}

目前崩溃是不是因为内存泄漏,还不清楚,只能等这个好了再说,还有这个finished信号和readyReady哪个信号作为读取的比较好,我之前一个程序返回的数据比较多,在readyReady的信号槽中读取,会读取不完成,但是finished能够全部读取,所以我后面的程序都改成finished的了。
2019/12/26追加
我发现有这么一个现象,关键代码如下:
request.setUrl(QUrl(postUrl));reply = manager->get(request);
//直接deleteLater
reply->deleteLater();reply = nullptr;
上面的代码不会崩溃,但好像没有这么做的。
---------------------------------------------------------------------------------
request.setUrl(QUrl(postUrl));
reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, [=]() //在QNetWorkReply的finished信号中deleteLater
{
        if (reply->error()) {
            //错误直接返回,因为连条码都没有
            qDebug() deleteLater();
            reply = nullptr;
            return;
}

        reply->deleteLater();
        reply = nullptr;
});
上面的代码会很快崩溃。这点其实不是很理解,因为我程序的另外一个类中的http请求在finished中槽deleteLater,虽然也会崩溃,但不会这么快。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
request.setUrl(QUrl(postUrl));reply = manager->get(request);
connect(manager, &QNetworkReply::finished, this, [=](QNetworkReply *reply)   //改成manager的finished信号,然后使用传过来的reply{
        qDebug() deleteLater();
        reply = nullptr;});
-------------------------------------------------------------------------------------这个最奇诡
它不会崩溃(当然我也只是运行半个小时左右吧,长了不知道会不会崩),但是我发现每次执行的时候qDebug()
下一页 (1/2)
回帖(10):
10楼:这个问题我也碰到过,是在访问一个不可达的网址的时候,我直接关闭客户端,析构直接删了QNetwork ..
9楼:20091001753:在线翻译
http://www.qtcn.org/bbs/read-htm-tid-87901.html
这个 Demo 供 ..
8楼:不清楚你代码具体内容是什么,但我相信肯定reply 在slot函数中使用时就已经发生了变化,甚至已经 ..

全部回帖(10)»
最新回帖
收藏本帖
发新帖