10黑马QT笔记之内存回收机制
1 Qt的内存回收机制是依靠对象树来完成的。要想系统帮你自动回收子对象new出来的空间,需要满足以下两点要求:
1)指定父对象。
2)你指定的父对象是直接或者间接继承与QObject。也可以说继承QWidget,因为QWidget就是继承与QObject的。注意是指定的父对象是直接或间接,而不是继承的类。
例如上一篇文章中。w,b1,b2的对象树大概图。其实下图还可以在QWidget和b1之间添加MyWidget自定义的类,视频里应该省略没画。
2 下面给出一个例子。在窗口中new一个自定义的按钮类。该类肯定继承QPushButton,但与是否自动回收无关,应与指定的父对象是否继承与Qobject有关。然后指定父对象为当前窗口,窗口肯定继承与QWidget。所以我们可以在自定义按钮内的析构函数打印一句话,当关闭窗口时,若打印了这句话,说明被自动释放了new的空间。否则不是自动。
3 代码:
1)项目文件:省略。
2)自定义按钮头文件:
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton>
class MYButton : public QPushButton
{
Q_OBJECT
public:
explicit MYButton(QWidget *parent = 0); //QWidget不需要改 因为指定父对象仍是窗口类
~MYButton(); //自己添加析构函数
signals:
public slots:
};
#endif // MYBUTTON_H
3)窗口头文件:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
};
#endif // MYWIDGET_H
4)自定义类.cpp文件:
#include "mybutton.h"
#include<QDebug>
MYButton::MYButton(QWidget *parent) : QPushButton(parent)
{}
//看他是否会调用析构函数
MYButton::~MYButton()
{
qDebug()<<"我是自定义按钮的,我被自动析构了!";
}
5)窗口类.cpp文件
#include "mywidget.h"
#include<QDebug>
#include<QPushButton>
#include<mybutton.h>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
this->resize(500,400);
//若在该窗口构造内再new一个窗口会出错(好像不给窗口内嵌窗口) 即不在下面~MyWidget()测试
//所以我们为了更好的测试new出来的内存 会被自动调用析构 下面自定义一个按钮MYButton类
MYButton *m1=new MYButton(this);
m1->setText("123");
}
MyWidget::~MyWidget()
{
}
6)主函数:
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
总结该例子:总的来说不难理解。