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

今天主要解决了一个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也一样.

猜你喜欢

转载自blog.csdn.net/qq_30126571/article/details/78036576