如下图所示:多次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().