在Qt中当你创建一个QObject对象的时候会提供一个Parent对象指针,QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,即父对象指针。
且父对象维护着一个children()列表,在创建QObject对象时,QObject对象会自动添加到其父对象的children()列表,当父对象析构的时候,这个列表中的所有对象也会被析构。
- 每个继承自QObject类的对象通过它的对象链表(QObjectList)来管理子类对象,当用户创建一个子对象时,其对象链表相应更新子类对象信息,对象链表可通过children()获取。
- 当父对象析构的时候,其对象链表中的所有(子)对象也会被析构,父对象会自动将其从父对象列表中删除。Qt 保证没有对象会被 delete 两次。开发中手动回收资源时建议使用deleteLater代替delete,因deleteLater多次是安全的,而delete多次是不安全的。
QWidget是能够在屏幕上显示的一切组件的父类。QWidget继承自QObject,即也继承了对象树这种关系
注意构建/析构 QObject 的顺序问题
例1:
{
QWidget window;
QPushButton btn("button", &window);
}
先创建window,后创建btn。标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作用域时,会先调用 btn 的析构函数,将其从父对象 window 的子对象列表中删除,然后才会再调用 window 的析构函数。
例2:
{
QPushButton btn("button");
QWidget window;
btn.setParent(&window);
}
先创建btn,后创建window。因为 window 后创建,这段代码在超出作用域时,先调用 window 的析构函数(此时 btn 被第一次析构)。接着调用 btn 的析构函数(此时 btn 被第二次析构),这时由于被两次析构,C++ 不允许调用两次析构函数,因此程序会崩溃。
因此需要养成良好的习惯。在 Qt 中,尽量在构造的时候就指定 parent 对象。!!!
相关文章
暂无评论...