初学Qt:内存回收机制

来源:互联网 发布:复制淘宝店铺违规吗 编辑:程序博客网 时间:2024/06/02 04:15

    在Qt创建界面时,经常用到new来创建新的控件,如

QPushButton b1 = new QPushButton(this);

    在C++当中,new出一个动态分配的内存空间后,一定在程序结尾加入delete,否则会出现内存泄露问题。

    但是在Qt当中,程序在退出之前会自动调用一些析构函数,将一些对象所动态分配的地址释放,而这些对象有以下两种情况:

1、该对象所在的类是继承与或间接继承与QObject类。

比如:QWidget是继承与QObject的,而所有的控件又是继承与QWidget的,因此如果一个具体的控件是new出来的,那程序会在最后自动把它delete(即调用析构函数来释放地址)。

2、该对象所在的类虽然不是继承与或间接继承与QObject类,但是该对象的对象树最终是继承于QObject或其派生类的。

所谓对象树,即以父子关系联系起来的所有对象。制定父对象的方式有以下两种,

QPushButton b1 = new QPushButton(this);b1.SetParrent(this);

对象树如下:

image

    上一级对象是下一级的父对象,如果对象a是是由CObject或其子类实例化的,那么程序在结束时会自动释放对象树内的所有的对象,而释放对象是由下到上(即由c到b再到a)。

PS:要明确“父对象、子对象”以及“父类、子类”两组概念之间的区别。