我是否需要在Qt中释放槽参数的资源
Do I need to release resources of slot parameter in Qt?
作为一个例子,请看下面的代码:
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()被调用对于处于没有运行事件循环的线程中的对象,则对象将在线程结束时被销毁。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 抛出新表达式的参数子表达式时释放内存
- 如何使用自动和声明的关键字来释放模板参数扣除
- C++释放传递给函数中参数的内存,或者将其留给调用方
- 如何释放分配的参数
- 为什么用一个参数而不是两个参数调用释放函数?
- 可视C++:错误 C2664:"释放DC":无法将参数 1 从"HDC"转换为"HWND"
- 我是否需要在Qt中释放槽参数的资源
- 从 DLL 导出函数释放 CStringArray&参数时的堆冲突
- 我需要从GetNamedSecurityInfo API中释放哪些返回的参数