Qt内存自动释放有两个前提条件:1. 必须是QObject的派生类 2.必须指定了parent对象 即:Qt 中 父亲被删除的时候会自动销毁他的孩子。所以如果New出来的并且没有父亲。那么则需要手动删除它。需要,不然那块空间就一直占用了
QLabel* lb=new QLabel();
delete (lb);
if(lb==NULL)
{
}
delete(this);//this是继承Qweiget基类的子控件,当new出来此控件后,想要彻底释放此子控件,需这样用delete手动释放,
//用delete释放后可触发此控件类的析构函数彻底释放相关ui资源,可通过断点观察
如果是自己 new 出来的, delete 掉就好了.
如果不是new 出来的, 就不用管. qt 会自己释放掉.
QT 关闭窗口是否销毁窗口及子部件
顶层窗口调用close:应用程序销毁该窗口部件及子部件。
非顶层窗口close:关闭时只是隐藏,不会被销毁。
qt对象销毁过程delete
在C++中学习过程中,我们都知道:
delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。
Qt作为C++的库,显然是不会违背C++的前述原则的。可是:
在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?!
注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习 一文
Qt半自动的内存管理
在Qt中,以下情况下你new出的对象你可以不用亲自去delete (但你应该清楚delete在何处被Qt调用的,怎么被调用的):
QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象(本文内容围绕这一点展开)
除此之外,有些类的对象可以接收设置一些特别的标记,比如:
QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)
QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped
QRunnable::setAutoDelete()
MediaSource::setAutoDelete()
...
注意:这些用法会有些陷阱,请注意看本文最后的3个小例子。
在Qt中,最基础和核心的类是:QObject 。它的魔力很大,本文只关注两点:
父子关系
deleteLater
父子关系
在Qt中,每个 QObject 内部都有一个list,用来保存所有的 children,还有一个指针,保存自己的parent。当它自己析构时,它会将自己从parent的列表中删除,并且析构掉所有的children。
注意:在 Qt 中,我们经常会遇到
基类、派生类,或父类、子类。这是对于派生体系来说的,和在C++相关书中看到的完全一样,与这的parent无关
父对象、子对象、父子关系。这是Qt中所特有的,也就是这儿的parent所引入的,与类的继承关系无关
建立与解除
Q_INVOKABLE QObject::QObject ( QObject * parent = 0 )
创建一个QObject对象时,如果指定了父对象,它就会将自己添加到父对象的 children 列表中
QObject::~QObject () [virtual]
当一个QObject对象析构时,它会将自己从父对象的 children 列表中移除(parent非0的话)
void QObject::setParent ( QObject * parent )
通过该函数,将自己从原父对象的children中删除,添加到新parent的children列表中
注:这三个函数都是通过一个内部私有函数来实现的,这就是
QObjectPrivate::setParent_helper(QObject *o)
获取父、子对象
每个QObject只有一个父对象:
QObject * QObject::parent () const
子对象可以有多个