QLayoutItem指针double free

5 篇文章 0 订阅

创建了一个QLayoutItem指针,并放入一个layout之后,如果在widget析构的时候手动delete QLayoutItem对象会造成程序崩溃,原因如下:

// 步骤1

/*!
    \reimp

    将item插入layout中时,qt创建了一个struct,然后放入了一个list中
    list的定义为:QList<QBoxLayoutItem *> list;
*/
void QBoxLayout::addItem(QLayoutItem *item)
{
    Q_D(QBoxLayout);
    QBoxLayoutItem *it = new QBoxLayoutItem(item);
    d->list.append(it);
    invalidate();
}

// 步骤2

/*!
    Destroys this box layout.

    The layout's widgets aren't destroyed.

    layout的析构函数,调用deleteAll函数
*/
QBoxLayout::~QBoxLayout()
{
    Q_D(QBoxLayout);
    d->deleteAll(); // must do it before QObject deletes children, so can't be in ~QBoxLayoutPrivate
}


// 步骤3

/*
    deleteAll函数的定义
    就是把list中的对象全部取出来析构掉
*/
inline void deleteAll() { while (!list.isEmpty()) delete list.takeFirst(); }

如果在外部释放了QLayoutItem对象,那qt是不知道的(QLayoutItem没有继承QObject,无法通过QObject的destroyed信号得知对象被释放),会造成了double free,进而程序崩溃。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值