QNetworkAccessManger 内存泄漏问题

如下图所示:多次POST 和Finished。出现内存增长问题。

http->post() http->get()  和Finished槽函数理论上应该成对出现。但是网络复杂,Qt 也存在bug。是造成此问题出现的本质原因。QT上使用QnetWorkAccessManger类调用http时最好的做法放到一个进程中。

1. 全局QNetworkAccessManager. connect绑定http的 finished信号。到 replyFinished(QNetworkReply*)

    http = new QNetworkAccessManager();
    http->setObjectName("Qnetwork:1");
    connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));

2.在replyFinished的函数中 所有return的地方之前 调用 reply->deletater().

void httpRequest::replyFinished(QNetworkReply *reply)
{
    QString r_url;
    r_url=reply->url().toString();
    QByteArray r_byte;
    r_byte.clear();

    if(reply->error() != QNetworkReply::NoError)
    {

        r_byte=reply->errorString().toUtf8();
        send_notify_err(r_url,1);
        qDebug("QNetworkReply::err  %d",reply->error());
        reply->deleteLater();
        return ;
    }
    r_byte= reply->readAll();
    if (r_byte.isEmpty())
    {
        r_byte=QString("isEmpty").toUtf8();

        send_notify_err(r_url,2);

        reply->deleteLater();

        qDebug()<<"r_content isEmpty()";

        return ;
    }

   // m_callbackFunc(&r_url,&r_byte);
    reply->deleteLater();
    send_notify_msg(r_url,r_byte);

}

3.针对其他原因造成有post发送,没有返回 ,也一定不会reply->deleter()的问题。解决办法如下

利用超时机制。在QT5.15上有函数设置超时时间和信号发出

void QNetworkRequest::setTransferTimeout(int timeout = DefaultTransferTimeoutConstant) 

QNetworkReply::errorOccurred 信号发出。

天杀的QNetworkRequest终于加入超时机制了_wangw8507的博客-CSDN博客_qnetworkrequest 超时

QT5.15以下可以使用如下方法

Qt - QNetworkAccessManager 超时机制_JYU_hsy的博客-CSDN博客_qnetworkrequest 超时

这里面官方有如下解释。两段的意思都很明确。 特别提醒:use deleterLater() 替代delete

 QNetworkReply   Note: Do not delete the object in the slot connected to the error() or finished() signal. Use deleteLater().

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值