• 10994阅读
  • 5回复

Qt的内存回收机制 [复制链接]

上一主题 下一主题
离线roc496
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-31
— 本帖被 xtfllbl 执行锁定操作(2010-06-22) —
看到几位网友在说这个问题
看了些这方面的文章,不敢说有很深的了解
只为和大家交流心得
和大家讨论下Qt内存回收机制
如果不对还请大家指正

Qt本身所含的400多个类都使由QObject继承而来
QObject在建立的时候就加入了内存回收机制
这个内存回收机制并不是能像程序员所期待的那样想让空闲的空间消失就消失的

大家都知道QObject类的构造函数里有个*parent指针
这个指针从字面意义上理解就是父指针
当parent的空间被指定释放时
QObject先检查在本对象中是否还有其他指针指向的空间未被释放(当然这个对象必须指定parent为当前的类)
如果发现还由未被释放的,就释放该指针的空间
例如

class Son;

class Parent
{
      Parent(QObject *parent=0);
private:
      Son *ps;
};


Parent::Parent(QObject *parent)
      : QObject(parent)
{
      ps = new Son(this);
}


如上
在此我假设class Son由QObject派生而来
如果在上面的构造函数中没有this参数
也就是说ps没有parent那么当Parent的对象析构(或空间释放)时
ps的空间就不会被释放出来这样就产生了内存泄漏
而当ps有parent并为this时
当Parent的对象析构(或空间释放)完之前
首先Parent检查ps是否为Null
否则释放其空间
直到所有Parent内的对象释放完再自身发生析构(或者空间释放)

因此大家在做开发时要记得对parent赋值

当然Qt这套内存回收机制并不是很完美
但是对于GUI控件设计来说
我们程序员可以不用写析构函数

但如果在一些其他地方需要不设置parent的时候必须由程序员自己写析构函数了

本人拙见
如果不完整或不正确欢迎指正
[ 此贴被roc496在2009-02-01 11:51重新编辑 ]
离线axlrose

只看该作者 1楼 发表于: 2009-02-01
感谢楼主的分析,期待高手们献技,这个话题对很多Qt用户来说都很有帮助
枪炮与玫瑰
离线wd007

只看该作者 2楼 发表于: 2009-02-01
谢谢楼主,很有道理,版主“射精”吧!呵呵
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线wu9961

只看该作者 3楼 发表于: 2009-02-01
并未this应为并为this,希望作者改正,以免引起误会。
离线roc496
只看该作者 4楼 发表于: 2009-02-01
谢楼上的了
已更正...
离线goonman

只看该作者 5楼 发表于: 2010-06-22
如果是QPushButton,构造函数中没有this参数,会不会也引起泄漏呢?