Qt 销毁机制

 

首先了解这些对windows编程有更深入的理解,其实就是从Qt在windwos上就是win32的扩展了一下,一般程序退出后,即使不delete你分配的内存,操作系统也会帮着回收,Qt有着半自动的回收机制,为什么是半自动呢?个人理解如下,Qt中的一切事件,图形等都是经过QObject派生出来的,每一个QObject中都有一个线性表,为什么我会这么理解呢?在写程序的时候我们使用过findChild或者findChildren等 Template..我就好奇了为什么能找得出来,出于探求真理的目的,翻看了QObject。findChild源码如下:

template<typename T> //一个简单的模板函数,
inline T findChild(const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
{
    typedef typename QtPrivate::remove_cv<typename QtPrivate::remove_pointer<T>::type>::type ObjType;
    return static_cast<T>(qt_qFindChild_helper(this, aName, ObjType::staticMetaObject, options));
//!无奈Qt机智的用qt_qFindChild_helper()来包装了一下。。无奈这个函数无源码
//!但博主胡乱猜测一下,里面应该是对线性表的objectname遍历判断~
}

 

  经过测试要使用他们的话必先要指定parent();由此我就可以分析出,其实每指定一个parent,就会帮你添加一个结点,从整个程序来看,这样就形成了一颗树树树!!于是我又想到,Qt为什么推荐使用delete later,因为它可以帮你删除线性表上的子孙啊~delete反而可能造成内存泄漏,但从测试程序看出,delele并没有造成内在泄漏且孩子也都完整的销毁了。区别就是delete不会发送DeferredDelete消息,而deletelater要发。 
一,在主窗口删除的退出程序的时候,略有不同,大体是这样一个流程: 
  1) 先给主窗口发送一个close 事件; 
  2) 再发送WindowDeactivate(释放窗口) 
  3) 如果都显示的话,儿子些全部都给我hide,hide的时候顺序还有点怪,先从爹再从最小的儿子 
  4) 最后再调用各自的析构就~顺序有点不太能理解就是从都爹开始,孩子层级析构

二,普通的一个Object删除大体是这样的流程: 
  1) 对删除的目标发送一个DeferredDelete事件,看文档说的是目标将被清除,当它整理好了后 
  2) 如果都显示的话,儿子些全部都给我hide,和上面那种一样 
  3) 再发一个childRemoved事件到它的爹那里去。 
  4) 调用各自的析构~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值