2016-10-10 44 views
1

举个例子,看看这段代码:我需要在Qt中释放slot参数的资源吗?

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

回答

3

根据docs,您需要释放该资源,但您不能在delete插槽内进行回复。您需要拨打deleteLater()代替:

注意:请求完成后,用户有责任在适当的时候删除QNetworkReply对象。不要直接在与finished()连接的插槽中删除它。您可以使用deleteLater()函数。

[...]

注意:不要删除回复对象连接到这个信号的插槽。使用deleteLater()。

2

你需要安排它像krzaq点缺失:

void MyApp::onUploadFinished(QNetworkReply *reply){ 
    QJsonObject root = QJsonDocument::fromJson(reply->readAll()).object(); 
    reply->deleteLater(); 
} 

deleteLater把你的对象上的关注清单,每当事件循环进入,这里的Qt运行时检查是从文档的exceprts:

计划删除此对象。

当控件返回到事件循环时,该对象将被删除。如果调用此函数时事件循环未运行(例如,在QCoreApplication :: exec()), 之前对象上调用了deleteLater(),则在启动事件循环后将删除该对象。如果 在主事件循环停止后调用deleteLater(),则不会删除 对象。从Qt 4.8开始,如果在线程中没有运行事件循环的对象上调用 ,则deleteLater()将在线程完成时被销毁。