Qt delete对象后程序闪退,后改为deleteLater

本文解决了一个Qt应用程序中的bug,该bug导致程序在删除QWidget后崩溃。通过使用deleteLater()代替直接delete,避免了同步处理中对象已被销毁的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天主要解决了一个bug

程序设计是想要点击一个widget,然后这个widget发送一个消息,让它的父对象进行一些处理操作,然后把它删掉.但是每次删除的时候不会出现问题,总是在后面不知道哪里出问题,程序都会崩溃:

0x00000000646A8ABC (Qt5Widgetsd.dll) (AI-Sentryd.exe 中)处有未经处理的异常:  0xC0000005:  读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

最后找到解决办法,原代码是 delete cell;这句执行完成后直接销毁对象. 后改为cell->deleteLater();QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。
因为在执行过程中需要右键widget,唤出菜单,然后发送一个信号给父对象进行操作处理.但是由于是在同一个线程中,同步处理,处理完槽函数后继续执行widget的函数,但这个时候widget已经被销毁了,所以程序异常.点击其他位置的widget正常,是因为删除的widget并不是刚刚点击的widget.
Qt官方是建议用这个方法的deleteLater().但是这个方法可能会造成内存释放不及时的问题.
另,Qt的父子关系中,当孩子释放,它会先解除与父亲的关系,再释放自己的孩子孙子,再释放.delete也一样.
### QT应用界面切换后程序崩溃解决方案 当QT应用程序在界面切换时发生闪退,通常意味着存在未处理的异常或资源管理不当等问题。为了有效解决问题并提高系统的稳定性,建议采取以下措施: #### 1. 实现崩溃捕捉机制 确保能够在程序崩溃时捕获到足够的调试信息以便后续排查问题。通过安装信号处理器来监听SIGSEGV等致命错误信号,在接收到这些信号之前保存堆栈跟踪和其他诊断数据[^3]。 #### 2. 使用多线程优化性能 如果界面上有复杂的计算任务或其他耗时操作,则应该考虑将其放置于独立的工作线程内完成。这样不仅可以防止阻塞主线程造成无响应状态,而且有助于减少因长时间占用CPU而导致的应用不稳定现象。具体做法可参照`QThread`类的相关文档说明[^4]。 ```cpp // 创建工作线程对象实例化 Worker *worker = new Worker(); QThread* thread = new QThread(); // 将工作者移动至新创建出来的子线程里边去跑起来干活儿 worker->moveToThread(thread); connect(worker,&Worker::finished,this,[=]() { worker->deleteLater(); // 清理内存空间释放资源 }); thread->start(); ``` #### 3. 检查UI组件生命周期管理 仔细审查涉及窗口部件销毁与重建逻辑的地方是否存在潜在风险点;比如父级容器被关闭前是否已经提前删除了其内部所有的子控件?另外还要注意连接槽函数之间的关系是否会因为对象消失而引发野指针访问的情况。 #### 4. 调试工具辅助定位原因 利用集成开发环境自带的功能(如断点设置、变量监视)或者第三方库(Google Breakpad/Minidump Analyzer),帮助更精准地找到触发崩溃的具体位置及其上下文条件。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值