我有一个QNetworkAccessManager来处理我所有的请求.该管理器可以在应用程序运行的任何时候接收到一个动作来发送一个post请求.我注意到在没有互联网的时候,QNetworkReply完成之前有将近70s的超时时间。
在类的构造函数中,我用创建管理器。
mgr = new QNetworkAccessManager(this);
connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));
connect(mgr,SIGNAL(sslErrors(QNetworkReply *, const QList<QSslError> &)),this,SLOT(handleSSLErrors(QNetworkReply *, const QList<QSslError> &)));
请求是用:
QNetworkReply * reply = mgr->post(request, payload);
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,
SLOT(slotError(QNetworkReply::NetworkError)));
对于networkreplies,我有一个信号槽。
connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));
我在requestFinished方法中删除了QNetworkReply的回复 rep->deleteLater();
.
这样我希望所有的QNetworkReply都能被自动删除。
在该类的解构函数中,我运行以下命令
delete mngr
我的想法:0:00我发送了一个请求,0:01我删除了mngr(自动删除了onfinished slot)1:10请求完成,不再有一个槽,所以deleteLater()没有被调用。
如何删除 "QNetworkAccessManager",我的应用程序可能每60秒发送一个请求,超时70秒(意味着总有一个正在进行的请求)。如何在不造成内存泄漏的情况下删除qnetworkmanager?
connect(mgr, &QNetworkAccessManager::destroyed, reply, &QNetworkReply::deleteLater);
QObjects提供的 destroyed()
信号。所以你可以连接你的经理 destroyed()
与公开答复 deleteLater()
. 当你的管理器被销毁时,所有打开的回复将被删除。如果回复结束时管理器还活着,你可以明确地调用 deleteLater()
就像你已经做的那样,这将防止回复滞留,直到你摧毁经理。