【问题标题】:When to delete QNetworkAccessManager pointer?何时删除 QNetworkAccessManager 指针?
【发布时间】:2014-04-24 11:43:05
【问题描述】:

这是我的代码。但我很困惑我应该在哪里删除m_networkManager。我可以做到这一点 onRequestCompleted() slot 但问题是我的程序经常调用 getData 函数。

我担心的是这种情况:

  1. getData() 被调用。
  2. onRequestCompleted() 插槽被触发之前,我的 程序再次调用getData()
  3. onRequestCompleted() 第一个 getData() 调用被触发。
  4. 我的程序删除了在第二次调用getData() 时实际分配的其他内存的m_networkManager。

我认为这种情况会导致崩溃。

void MyApp::getData() {
   QNetworkRequest request;
   request.setUrl(QUrl("http://www.domain.foo"));

   m_networkManager = new QNetworkAccessManager(this);   // Instance variable
   connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
           this, SLOT(onRequestCompleted(QNetworkReply *)));

   m_networkManager->get(request);

}

void MyApp::onRequestCompleted(QNetworkReply *reply) {
   QByteArray data = reply->readAll();
   reply->deleteLater();
   //m_networkManager->deleteLater();
}

【问题讨论】:

  • 为什么要为每个请求创建一个新的QNetworkAccessManager

标签: c++ qt qt4


【解决方案1】:

由于您每次调用MyApp::getData() 时都会创建新的QNetworkAccessManager 实例,因此您需要设法在MyApp::onRequestCompleted() 函数中删除正确的实例。您的代码中的问题是您总是删除最后创建的QNetworkAccessManager,而不是导致插槽调用的那个。我的建议如下:

void MyApp::getData() {
   [..]
   // Not class member. Will be deleted in the slot.
   QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
   connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
           this, SLOT(onRequestCompleted(QNetworkReply *)));
   [..]
}

void MyApp::onRequestCompleted(QNetworkReply *reply) {
   QByteArray data = reply->readAll();
   reply->deleteLater();

   // Delete object whose signal triggered this slot.
   QObject *networkManager = sender();
   networkManager->deleteLater();
}

【讨论】:

  • 我应该在回复之前删除networkManager还是没关系?
  • @user221458,我觉得没关系。
猜你喜欢
  • 2011-09-18
  • 2011-03-07
  • 1970-01-01
  • 2015-08-09
  • 2013-04-14
  • 2010-09-08
  • 2014-09-06
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多