QObject对象生命周期管理

QObject对象生命周期管理

1.C++中对象的生命周期管理是一个非常重要的话题,因为C++需要程序员自己手动管理内存,而这也是C++程序经常容易出现内存问题的重要原因。

1.1 特别是多线程环境下如何正确管理好对象的生命周期,更是C++程序开发中的一个难点,稍有不甚就会出现内存泄漏、程序崩溃等严重问题。

1.2 从C++11开始,智能指针(shared_ptr、weak_ptr、unique_ptr)的正确使用可以在一定程度上缓解这类问题,但也会引入其他一些问题(例如,智能指针自身的线程安全性等),比起带垃圾回收的编程语言,C++程序员在写代码时心中还是要始终绷紧这根弦。

2.在QT程序开发中,我们常用遇到的是父子窗口控件对象的管理问题。

2.1 好在,QT提供了一定的内在机制,帮我们管理了这方面的问题
在QT代码中,我们常常会看到代码明明有很多new出来的对象,但却很少看到delete对象的语句。
原因就在于QT通过父窗口的对象管理了所有其子窗口/控件对象的生命周期。
其实现原理并不复杂,但却很大方便了我们写代码,减少了一点心智负担。

2.2 在完全通过代码而不是使用ui designer来实现QT程序时
要注意父子对象类成员变量的声明顺序,要将父窗口声明在子窗口的前面
否则在子窗口对象析构时,可能会导致程序崩溃的问题。
原因在于,C++的类成员变量的析构顺序与其声明顺序是相反的
在使用QT布局器时,布局内的子对象析构时会去解绑父对象,如果这时父对象不存在,子对象解绑时会Crash。

2.3 在QT中,需要自己删除QObject对象实例时
最好不要用delete来直接删除,而是建议使用QObject::deleteLater()函数来实现延迟删除。后者通常是线程安全的
QT内部会在事件循环上投递一个QDeferredDeleteEvent事件,并在事件循环上去执行delete操作。

2.4 QT的窗口在被关闭时,默认不会delete该窗口对象,只是将窗口隐藏了
如果希望QT窗口在被关闭时自动能够delete掉自己,可以在该窗口的构造函数中设置这个的属性:setAttribute (Qt::WA_DeleteOnClose);。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值