举个例子,看看这段代码:
QNetworkRequest request(mResultsURL); //our server with php-script
connect(mNetworkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onUploadFinished(QNetworkReply*))); //This slot is used to debug the output of the server script
mNetworkManager->post(request,data);
和相应的接收槽:
void MyApp::onUploadFinished(QNetworkReply *reply){
QJsonObject root = QJsonDocument::fromJson(reply->readAll()).object();
// do some work
}
所以我的问题是:我是否需要添加
delete reply;
到功能结束?或者这是由Qt自动处理的吗?
答案 0 :(得分:3)
根据docs,您需要释放资源,但不能delete
插槽内的回复。您需要拨打deleteLater()
来代替:
注意:请求完成后,用户有责任在适当的时候删除QNetworkReply对象。不要在连接到finished()的插槽内直接删除它。您可以使用deleteLater()函数。
[...]
注意:请勿删除连接到此信号的插槽中的回复对象。使用deleteLater()。
答案 1 :(得分:2)
您需要将其安排为删除,例如krzaq积分:
void MyApp::onUploadFinished(QNetworkReply *reply){
QJsonObject root = QJsonDocument::fromJson(reply->readAll()).object();
reply->deleteLater();
}
deleteLater将您的对象放在一个监视列表中,Qt运行时会在事件循环进入时检查,这里是doc的异常:
安排此对象删除。
当控件返回到事件循环时,将删除该对象。如果在调用此函数时事件循环未运行(例如, 在QCoreApplication :: exec()之前在对象上调用deleteLater(), 一旦启动事件循环,将删除该对象。如果 在主事件循环停止后调用deleteLater() 对象不会被删除。从Qt 4.8开始,如果调用deleteLater() 在一个没有运行事件循环的线程中的对象上, 线程完成后,对象将被销毁。