Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

本博文并不会讲的很全,因为博主也是刚知道还有这么回事。
在Qt中,QObject是顶层对象,当Qt程序关闭的时候,QOject对象会被自动释放掉。
而因为QObject是顶层对象,所以其所有派生类在Qt程序关闭的时候都会被自动释放掉。 –这段话是我从别人的博客里抄来的。

实际的应用中,在一个动态分配的类指定了父对象后,其会被自动释放掉。但是如果没有指定父对象,则其不会被释放。

举个例子,我定义一个类,其继承自QPushButton,我在它的析构函数中加一个cout。这是其头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QWidget>

class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = nullptr);
~MyButton();

signals:

};

#endif // MYBUTTON_H

这是其cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// mybutton.cpp
#include "mybutton.h"
#include <QPushButton>
#include <iostream>

MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
setText("Hello, this is a button");
resize(300, 300);
}

MyButton::~MyButton()
{
std::cout << "This function is going to be deleted." << std::endl;
}

然后随便找个控件,在随便找的这个控件的构造函数里new一个我定义的MyButton类:

1
2
3
4
5
6
7
8
9
10
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
resize(100, 100);
move(100, 100);
QPushButton* qp = new MyButton(this);
qp->move(30, 30);
ui->setupUi(this);
}

可以看到,我并没有delete qp。但是在我编译运行程序并关闭程序后,我的控制台输出了我写在析构函数里的cout(Linux下的Typora有Bug,导致了我添加图片困难,所以我把输出复制了过来):

1
2
3
16:42:03: Starting /home/fire/codeSet/QtSet/build-untitled1-unknown-Debug/untitled1 ...
This function is going to be deleted.
16:42:08: /home/fire/codeSet/QtSet/build-untitled1-unknown-Debug/untitled1 exited with code 0

然后举一个没有被内存回收的例子: 在上面的构造函数中(即第三个代码块),删掉这段代码中的this:

1
2
3
4
// 删除前
QPushButton* qp = new MyButton(this);
// 删除后
QPushButton* qp = new MyButton();

其他部分不变,编译运行程序并关闭程序,输出如下:

1
2
17:24:57: Starting /home/fire/codeSet/QtSet/build-untitled1-unknown-Debug/untitled1 ...
17:24:59: /home/fire/codeSet/QtSet/build-untitled1-unknown-Debug/untitled1 exited with code 0

可以看到,cout语句并没有执行。
好,那么看到这里,相信机智的你已经明白了。
那么,本篇完。

评论



愿火焰指引你