本博文并不会讲的很全,因为博主也是刚知道还有这么回事。 在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 #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
这是其cpp文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #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语句并没有执行。 好,那么看到这里,相信机智的你已经明白了。 那么,本篇完。