Qt父子对象内存管理实现简析

用Qt大家都知道Qt有一套自己的内存管理机制:父子对象管理机制。适用于所有继承于QObject的类。即在一个类中指定他的父对象,可以用void QObject::setParent(QObject * parent)函数指定,也可以在构造时传入参数,一般继承自QObject的类,Qt-c自动生成的类模板的构造函数都是explicit 类名(QObject *parent = 0);这个parent就是你可以制定的父对象。当一个对象删除之后,会自动删除他的所有的子对象,这样你就可以有很多new,但是只有一个delete。(注:这个父子对象关系和继承的父子类是不一样的,而且可以说基本没关系的。)

下面我们就扒下Qt的源码,找下它的实现。

主要就是集中在QObject类的实现。其中出现的地方就是构造函数,析构函数setParent函数QObjectPrivate类的setParent_helperdeleteChildren函数。

其中QObject和QObjectPrivate的关系,也是Qt中d-pointer的应用,关于d-pointer的内容,见链接:http://qt-project.org/wiki/Dpointer_SimplifiedChinese 和 http://www.cnblogs.com/SkylineSoft/articles/2046391.html

首先先说一个类成员结构,来保存标志位和子对象列表,和父对象指针。

class Q_CORE_EXPORT QObjectData {
public:
   virtual ~QObjectData() = 0;
   QObject *q_ptr;
   QObject *parent;
   QObjectList children;
 
   uint isWidget : 1;
   uint blockSig : 1;
   uint wasDeleted : 1;
   uint isDeletingChildren : 1;
   uint sendChildEvents : 1;
   uint receiveChildEvents : 1;
   uint isWindow : 1; //for QWindow
   uint unused : 25;
   int postedEvents;
   QDynamicMetaObjectData *metaObject;
   QMetaObject *dynamicMetaObject() const;
};

其中:

QObjectPrivate继承自QObjectData。

QObjectList 是:typedef QList<QObject*> QObjectList;

类似:uint  wasDeleted : 1; 这个冒号(:)的作用是指定这个unsigned  int类型的wasDeleted只占用一个bits。

接着我们先看写QObject构造函数中的相关代码:

更多:http://www.dushibaiyu.com/2014/07/qt%E7%88%B6%E5%AD%90%E5%AF%B9%E8%B1%A1%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E5%AE%9E%E7%8E%B0%E7%AE%80%E6%9E%90.html

就不全部迁移到这儿了、、留个链接算了、、

你可能感兴趣的:(Qt父子对象内存管理实现简析)