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

Do I need to release resources of slot parameter in Qt?

本文关键字:释放 参数 资源 Qt 是否      更新时间:2023-10-16

作为一个例子,请看下面的代码:

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

根据文档,您需要释放资源,但是您不能在槽内delete应答。您需要调用deleteLater()代替:

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

[…]

注意:不要删除与该信号相连的槽位中的应答对象。使用deleteLater () .

您需要像krzaq点那样安排它的删除:

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

deleteLater将您的对象放在监视列表中,Qt运行时在事件循环进入时检查该列表,以下是文档中的摘录:

调度该对象的删除。

当控制返回到事件循环时,对象将被删除。如果调用此函数时事件循环未运行(例如:deleteLater()在QCoreApplication::exec())之前被调用。一旦事件循环开始,对象将被删除。如果deleteLater()在主事件循环停止后被调用对象将不会被删除。自Qt 4.8以来,如果deleteLater()被调用对于处于没有运行事件循环的线程中的对象,则对象将在线程结束时被销毁。