我是否需要在Qt中释放slot参数的资源?

时间:2016-10-10 00:02:36

标签: c++ qt memory-management

举个例子,看看这段代码:

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自动处理的吗?

2 个答案:

答案 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()   在一个没有运行事件循环的线程中的对象上,   线程完成后,对象将被销毁。