[英]When to delete QNetworkAccessManager pointer?
这是我的代码。 但是我很困惑应该在哪里删除m_networkManager
。 我可以在onRequestCompleted()
插槽中执行此操作,但问题是我的程序经常调用getData函数。
我担心的是这种情况:
getData()
被调用。 onRequestCompleted()
插槽之前,我的程序再次调用getData()
。 getData()
调用的onRequestCompleted()
被触发。 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.