10黑马QT笔记之内存回收机制

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();
}

总结该例子:总的来说不难理解。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值