繁体   English   中英

什么时候删除QNetworkAccessManager指针?

[英]When to delete QNetworkAccessManager pointer?

这是我的代码。 但是我很困惑应该在哪里删除m_networkManager 我可以在onRequestCompleted()插槽中执行此操作,但问题是我的程序经常调用getData函数。

我担心的是这种情况:

  1. getData()被调用。
  2. 在触发onRequestCompleted()插槽之前,我的程序再次调用getData()
  3. 第一个getData()调用的onRequestCompleted()被触发。
  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();
}

由于每次调用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM