【发布时间】:2020-10-06 23:40:44
【问题描述】:
我有一个 QNetworkAccessManager 来处理我的所有请求。 管理器可以在应用程序运行的任何时候接收到发送发布请求的操作。 我注意到在没有互联网的情况下,QNetworkReply 完成之前几乎有 70 秒的超时时间。
在类的构造函数中,我创建了管理器:
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 都会被自动删除。
在我运行的类的析构函数中
delete mngr
我的想法: 0:00 我发送请求。 0:01 我删除了 mngr(它会自动删除 onfinished 插槽) 1:10 请求结束,不再有 slot 所以 deleteLater() 没有被调用。
删除“QNetworkAccessManager”的正确方法是什么,我的应用程序可能每 60 秒发送一个请求,超时 70 秒(这意味着总是有一个持续的请求)。如何在不造成内存泄漏的情况下删除 qnetworkmanager?
【问题讨论】:
-
也许在
requestFinished的槽中调用类deleteLater()? -
@wthung 我有,但这不包括在请求完成之前删除 mngr 的场景,因为此时插槽不再存在
-
是否需要“0:01 我删除 mngr”?看起来该类很快就被删除了,但我认为应该在调用
requestFinished插槽后删除该类。由于该类也是QObject派生类,所以只需在requestFinished的槽中调用deleteLater()即可 -
@wthung 这只是一个会引起问题的时间线示例。如果插槽不存在,如何删除回复。如果插槽仍然存在,则不会删除 mngr 对吗?
-
也许一种将指针存储到全局指针的丑陋方式可以解决问题,但我不建议这样做。我建议让课程保持活力,直到它不再被使用。这样你就不会遇到你问的问题了。
标签: c++ qt qnetworkaccessmanager