当前位置: 首页 > news >正文

Qt中delete与deleteLater()的使用

在 Qt 中,deletedeleteLater() 都用于释放对象内存,但适用场景不同,核心区别在于释放时机安全性

1. 直接使用 delete

  • 作用:立即释放对象内存,销毁对象。

  • 适用场景

    • 确保对象当前没有被 Qt 事件循环引用(如没有正在处理的信号、事件)。
    • 在非事件处理函数中销毁对象(如初始化阶段、析构函数中)。
    • 对象是独立创建的,且明确知道其生命周期已结束。
  • 示例

    // 在析构函数中释放无父对象的子控件
    ParentWidget::~ParentWidget() {if (m_child != nullptr) {delete m_child; // 直接释放,此时对象无事件处理m_child = nullptr;}
    }
    
  • 风险:如果在对象正在处理事件(如槽函数执行中)或发送信号时调用 delete,可能导致程序崩溃(对象被销毁后仍被事件循环访问)。

2. 使用 deleteLater()

  • 作用:向 Qt 事件循环发送一个“延迟删除”事件,事件循环会在当前所有事件处理完毕后,自动调用 delete 销毁对象。

  • 适用场景

    • 信号槽或事件处理函数中销毁对象(避免当前事件未处理完就销毁对象)。
    • 销毁正在被 Qt 事件系统引用的对象(如窗口、控件)。
    • 不确定对象是否仍在被使用时(如在多线程场景中)。
  • 示例

    // 在槽函数中安全销毁自身或其他对象
    void MyWidget::onCloseButtonClicked() {// 销毁自身,确保当前点击事件处理完毕后再执行this->deleteLater(); // 或销毁其他控件if (m_dialog != nullptr) {m_dialog->deleteLater();m_dialog = nullptr; // 避免后续误用}
    }
    
  • 优势

    • 避免“对象正在被使用时被销毁”的崩溃风险。
    • 自动处理对象关联的信号槽和事件,确保资源释放的安全性。

核心区别总结

场景推荐使用原因
析构函数中释放对象delete此时对象无事件处理,可直接释放
信号槽/事件处理中释放对象deleteLater()避免事件未处理完就销毁对象
销毁正在显示的窗口/控件deleteLater()确保窗口事件(如关闭动画)完成后再释放
独立的、无事件关联的对象delete可立即释放,无需延迟

注意事项

  • deleteLater() 仅对 Qt 元对象系统管理的对象(继承自 QObject)有效。
  • 调用 deleteLater() 后,应避免再访问该对象(虽然对象仍存在 until 事件循环处理删除,但逻辑上已标记为待销毁)。
  • 对于非 QObject 派生类的对象,只能使用 deletedeleteLater() 不可用)。
http://www.dtcms.com/a/391266.html

相关文章:

  • AD5621(单通道缓冲电压输出DAC)芯片的详细用法
  • vLLM的面试题
  • 最优控制3 -- 动态规划-一个解析解的例子
  • 深入分析大众点评 Ajax 接口:直接请求 JSON 数据高效获取评论
  • 京东零售张科:DataAI Infra会成为驱动未来的技术基石
  • Java 运维中的一些常用命令
  • 用 go-commons 打造一套最小可行监控体系
  • 广东省省考备考(第一百零二天9.19)——言语(拔高突破第二节课)
  • 在vscode中,在powershell 下,如何进入子目录?
  • 易语言源码怎么制作软件 易语言源码和模块怎么做成软件
  • 4-2〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸目录遍历漏洞-B
  • 【Javaweb】http协议-请求与响应
  • 内网穿透系列十三:wstunnel 一款通过 Websocket 或 HTTP2 隧道传输的内网穿透工具
  • 【开关电源篇】自激振荡开关电源原理详解-从模块解析到故障维修
  • SpringBoot+Vue实现图片上传
  • C++ 函数指针与排序策略
  • 12分钟讲解Python核心理念
  • 01数据结构-串和KMP算法
  • 前端性能优化实用方案(三):骨架屏提升30%用户感知速度
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控一站式建设方案
  • window XP环境下配置VC6.0的Win32汇编语言开发环境
  • 【算法】0_算法工程师常见算法题
  • 免费插件分享 | BaseTool
  • sk04.【scikit-learn基础】--『监督学习』之 线性回归
  • Ubuntu终端切换WiFi
  • eBest渠道商管理软件:快消品渠道数字化的“破局利器”
  • 基于protues的电子时钟仿真与模拟
  • FastProperty 高效的属性读写设置
  • 【开题答辩全过程】以 基于Java的失物招领平台为例,包含答辩的问题和答案
  • 【7/20】前后端整合:Vue.js 调用 Express API,操作 MongoDB 数据,实现用户管理系统