【问题标题】:QNetworkAccessManager delete later while requests are addedQNetworkAccessManager 稍后在添加请求时删除
【发布时间】: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-&gt;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


【解决方案1】:
connect(mgr, &QNetworkAccessManager::destroyed, reply, &QNetworkReply::deleteLater); 

QObjects 提供destroyed() 信号。因此,您可以将您的经理destroyed() 与开放回复deleteLater() 联系起来。当您的经理被销毁时,所有打开的回复都将被删除。如果回复结束时经理还活着,您可以像以前一样明确调用deleteLater(),这将防止回复一直持续到您销毁经理为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多