QNetworkAccessManager 在添加请求时稍后删除

QNetworkAccessManager delete later while requests are added

我有一个 QNetworkAccessManager 来处理我所有的请求。 管理器可以在应用程序 运行ning 的任何时候接收发送 post 请求的操作。 我注意到在没有互联网时 QNetworkReply 完成之前几乎有 70 秒的超时时间。

在 class 的构造函数中,我创建了管理器:

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)));

对于网络回复,我有一个信号槽:

connect(mgr,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestFinished(QNetworkReply*)));

我用 rep->deleteLater();.

删除了 requestFinished 方法中的 QNetworkReply 代表

有了这个,我希望所有 QNetworkReply 都被自动删除。

在 class I 运行

的析构函数中
delete mngr

我的想法: 0:00 我发送一个请求。 0:01 我删除了 mngr(它会自动删除 onfinished 插槽) 1:10 请求完成,不再有插槽,因此不会调用 deleteLater()。

删除 'QNetworkAccessManager' 的正确方法是什么?我的应用程序可能每 60 秒发送一个请求,超时时间为 70 秒(意味着始终有一个正在进行的请求)。如何在不造成内存泄漏的情况下删除 qnetworkmanager?

connect(mgr, &QNetworkAccessManager::destroyed, reply, &QNetworkReply::deleteLater); 

QObjects 提供 destroyed() 信号。因此,您可以将您的经理 destroyed() 与公开回复 deleteLater() 联系起来。当您的经理被销毁时,所有打开的回复都将被删除。如果回复结束时管理器仍然存在,您可以像您已经做的那样显式调用 deleteLater(),这将防止回复在您销毁管理器之前一直存在。