Qt中的析构函数

Overview

在Qt中,QObject将它自己组织成为一个对象树,当从QObject继承创建新对象时,新对象就会添加的父对象的子孙列表中。当删除父对象时,会自动将子孙对象一并析构。

这就是为什么在Qt编程中,我们往窗口中动态(使用new)添加部件(Qwidget)后,而在析构函数中并不需要自己编写析构函数去删除这些new出来的widgets。因为Qwidget对象时Qobject对象的子对象。


QObjects的析构顺序

当Qobject对象创建在堆中(用new运算符),这个对象就会加入对象树中。当树中某个对象删除,那么这个对象的子孙结点对象一并删除(调用析构)。没有对象会被析构两次。

当Qobject对象创建到栈中,也会有相应的析构行为。通常析构顺序也不会有什么问题。看下面代码:

  1. int main ( )
  2.   {
  3.      QWidget window ;
  4.      QPushButton quit ( "Quit" ,  &window ) ;
  5.     ...
  6. }

父对象window和子对象quit都是QObjects对象。qpushbutton继承自qwidget,qwidget继承自Qobject,根据c++标准,会先析构quit,然后析构window。所以quit不会被析构两次。

但是下面代码有问题:

  1. int main ( )
  2.   {
  3.      QPushButton quit ( "Quit" ) ;
  4.      QWidget window ;
  5.  
  6.     quit. setParent ( &window ) ;
  7.     ...
  8. }

这时,父对象的析构函数会先被调用,因为父对象后被创建。让后调用子对象(quit)的析构函数,而quit是局部变量,quit出了作用域后才能被析构,因此出错。

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值