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);。
QObject对象生命周期管理_第1张图片

你可能感兴趣的:(qt,开发语言)