gpt4 book ai didi

c++ - 什么时候删除 QNetworkAccessManager 指针?

转载 作者:行者123 更新时间:2023-11-30 01:53:18 28 4
gpt4 key购买 nike

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

我担心的是这种情况:

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

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

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

关于c++ - 什么时候删除 QNetworkAccessManager 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23267925/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com