转载:https://blog.csdn.net/myjqc/article/details/8569196 (链接错误解决办法)
我们都知道在C++中,new和delete是成对出现的,那么在QT中内存中是不是同样如此呢,我们来验证一下。
第一步新建工程: MyWidget
第二步:添加一个自定义的按钮类(MyButton)
第三步:修改自定义按钮类的父类为QPushButton(QPushButton也是继承自QWidget),同时自定义按钮类添加析构函数,并在析构函数里打印输出
mybutton.h
#ifndef MYBUTTON_H #define MYBUTTON_H #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: explicit MyButton(QWidget *parent = 0);
~MyButton();
signals: public slots: }; #endif // MYBUTTON_H
mybutton.cpp
#include "mybutton.h" #include <QDebug> MyButton::MyButton(QWidget *parent) : QPushButton(parent) { } MyButton::~MyButton() { qDebug() << "析构函数被调用了"; }
第四步:在主窗口上创建显示
#include "mywidget.h" #include "mybutton.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { MyButton *pBtn = new MyButton(this); pBtn->setText(QStringLiteral("我是动态创建的按钮,我不手动释放")); } MyWidget::~MyWidget() { }
第五步:开始调试,发生了链接错误
原因是moc没有更新,无论怎么重新构建,清理,构建都不行,用一个笨办法解决了:就是删除项目同名文件夹下的调试文件夹
然后重新调试运行,成功了
第六步:关闭窗口,程序退出,看自定义按钮类的析构函数是否被调用
可以看到打印出了 析构函数被调用。因此我们总结出,在QT中,有它自己的内存回收机制,但也是有前提条件的:
1.动态创建的对象必须指定父对象
2.动态创建的对象直接或者间接继承于QObject基类