Qt --- 对象树机制、析构顺序导致崩溃

{
    QWidget widget;
    QPushButton buttonQuit("Quit",&widget);
}

 作为父组件的widget,子组件buttonQuit都是QObject的子类;上述代码运行没有问题。

代码析构时,因为C++的要求,局部对象的析构时按照实例化顺序逆向的顺序析构。当这段代码执行完成,会先析构buttonQuit,然后将其从父对象widget的子对象列表中删除。然后析构widget对象。

如果我们将代码携程下列样式:

{
    QPushButton pushbuttonQuit("Quit");
    QWidget widget;
    pushbuttonQuit.setParent(&widget);
}

这段代码将会出现崩溃:问题是pushbuttonQuit会被析构两次而崩溃;

当代码执行完成后,按照C++的析构顺序为对象生成顺序的逆序来析构,因为pushbuttonQuit在widget对象前生成,所以先析构widget对象,发现子列表中有子对象pushbuttonQuit,则也会将其析构;析构完widget对象后再去析构pushbuttonQuit,就会二次析构而崩溃。

在Qt中,析构父对象而默认也会将父对象的子对象列表一并析构,这种机制是Qt的对象树引入的,可以帮我们开发时解决一定的内存管理问题,但是也会引入这种类似的问题。

所以,开发时就要有良好的习惯,在构造时候就指定父对象,并且可以大胆在堆上创建。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值