当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。 这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。 Qt 自动回收不像Java这种,有垃圾回收机制。 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 所以为什么 main函数 里面main widget是分配在栈上的原因。其他new出来的东西都以这个widget作为父亲。 当程序最后结束了,main widget弹栈。。父亲被销毁。。孩子跟着被销毁。。 所以如果你自己new 出来的。没有父亲,不删除就会造成内存泄漏。 ------------------------------ 转载-------------------------------------------- Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错。 收录一篇不错的文章:在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::DeleteWhenStoppedQRunnable::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 子对象可以有多个 const QObjectList & QObject::children () const 所以可以根据条件来查找喽: T QObject::findChild ( const QString & name = QString() ) const QList
当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。
这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。我们需要显试删除(就是用DELETE删除)的对象是那些使用NEW创建的并且没有父对象的对象(切记是new的才要delete,通过成员函数获得的对象,没有特殊说明的,千万不要随便delete.)。如果我们在删除一个对象的父对象之前删除它,QT会自动地从它的父对象的子对象列表中移除它的。 Qt 自动回收不像Java这种,有垃圾回收机制。 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。