Qt学习之路8--Qt对象间父子关系

在之前的控件使用中我们只使用过new,而没有使用delete,这难道不会造成内存泄漏吗???然而事实是由于是使用Qt对象进行开发,所以不会存在内存泄漏,这是为什么呢?下面细细道来。
什么是Qt对象?Qt对象指的是我们定义的类它继承了QObject类,由这个类定义的对象才叫Qt对象。
Qt对象有什么特别的呢?Qt对象间可以存在父子关系,即每个对象都保存有它的所有子对象的指针,由一个链表保存起来;每个对象都包含一个指向它父对象的指针。所以当我们为一个Qt对象指定它的父对象时,它的父对象就会将这个子对象加入到自己的子对象链表中,同时该对象会保存指向其父对象的指针。
通过图示了解这种关系;
这里写图片描述
可以通过setParent()函数设置对象的父对象。
这里写图片描述
通过上述实验可以看出Qt对象之间确实是存在父子关系的。那么这种关系与我们最开始提到的是否会内存泄漏问题有什么联系呢?
这种父子关系在对象的销毁之间起到作用:当Qt对象被销毁时,将它从父对象的children链表中移出,同时也将自己的children链表中的所有子对象销毁,如果子对象中还包括其它子对象,那么就会一并删除所有子对象。
这里写图片描述
根据Qt对象的父子间关系,很形象的用树来描述,当子树根结点被销毁,那么整棵树就会被销毁。
由于Qt中使用的是对象树的关系,所以尽量减少内存泄漏的问题 ,可以一定程度说Qt中的内存是由对象树管理的。
这里写图片描述 Qt对象间可以存在父子关系的,通过这个父子关系可以得到对象树,Qt对象在销毁时可以解除和父对象间的父子关系,同时Qt对象销毁时将同时销毁所有的子对象。