qt中使用对象树的方式来管理对象。所谓对象树就是对象与对象之间存在树状关系。一个父对象可以含有多个子对象,但是一个子对象只能含有一个父对象。当父对象析构时,会自动析构其所含有当所有子对象。如:
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr, QString name="")
:QWidget(parent),m_name(name){}
~Widget(){ qDebug() << m_name << "析构了"; };
QString m_name;
};
p_a:{
Widget w1(nullptr, "w1");
Widget *w2 = new Widget(&w1, "w2");
}
当p_a程序段运行结束时,会按照变量声明的顺序反向析构变量。所以w2应当会先被析构,然后析构w1。但是w2是new出来当指针,需要调用delete才能析构。所以会跳过w2直接析构w1。析构w1时,发现其含有子对象w2,于是在w1析构完成后会继续析构w2,所以最终的运行结果如下:
"w1" 析构了
"w2" 析构了
使用对象树来管理对象时需要注意以下几点:
- 如果子对象先析构了,然后再析构父对象,这时并不会对程序造成影响;
- 如果父对象由析构了,然后再析构子对象,这时程序会发生异常。
原因分析:这是因为通过析构父对象来析构子对象时会先判断子对象是否被析构,如果已经被析构,则不再析构