RTTI symbol not found for class ‘QObject‘ + double free or corruption

65 篇文章 16 订阅
这篇博客探讨了在Qt编程中,由于对象生命周期管理不当导致的崩溃问题。主要聚焦于Qt对象的自动销毁机制,指出如果子级对象不是通过`new`创建的(即栈对象),在父级对象销毁时,尝试使用`operatordelete`将会导致错误,因为只有new的才能被delete。博客强调所有QObject必须由`operatornew`创建或在父级对象之前手动销毁,以避免内存问题。
摘要由CSDN通过智能技术生成

记录一个崩溃crash的问题。
在方法中使用一个栈类对象时,程序出现崩溃。
原因是:
QT中 如果一个子级对象是new生成的(堆对象),当父级对象销毁时,会自动调用operator delete删除他的所有子级对象。
这样有三种情况:

  1. 如果一个子级对象是new生成的,他无需自己销毁;
  2. 如果一个子级对象不是new生成的(栈对象),他在父级对象销毁前自己主动销毁自己,没问题。
  3. 如果一个子级对象不是new生成的(栈对象),他不在父级对象销毁前自己主动销毁自己,父级对象调用operator delete他时就会出错(因为new的才能delete)。父对象可能有this->deletelater(); 触发!!!
    (在Qt中,每个 QObject 内部都有一个list,用来保存所有的 children,还有一个指针,保存自己的parent。当它自己析构时,它会将自己从parent的列表中删除,并且析构掉所有的children。如以下QT源代码:)
QObject::~QObject()
{
 //...
 if (!d->children.isEmpty())
        d->deleteChildren();
if (d->parent)        // remove it from parent object
        d->setParent_helper(0);
  //...
}        
void QObjectPrivate::deleteChildren()
{
    Q_ASSERT_X(!isDeletingChildren, "QObjectPrivate::deleteChildren()", "isDeletingChildren already set, did this function recurse?");
    isDeletingChildren = true;
    // delete children objects
    // don't use qDeleteAll as the destructor of the child might
    // delete siblings
    for (int i = 0; i < children.count(); ++i) {//销毁所有子对象
        currentChildBeingDeleted = children.at(i);
        children[i] = 0;
        delete currentChildBeingDeleted;//非new生成的在此会出问题!!!
    }
    children.clear();
    currentChildBeingDeleted = 0;
    isDeletingChildren = false;
}

总结:所有QObject必须由operator new创建,或者必须在父级之前被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值