首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SegFault删除QTreeWidgetItem

SegFault删除QTreeWidgetItem
EN

Stack Overflow用户
提问于 2017-08-24 16:27:13
回答 1查看 399关注 0票数 0

我在删除QTreeWidgetItem的代码中遇到了一个奇怪的问题。特别是,我的课上有这样的内容:

代码语言:javascript
复制
std::map<int, std::unique_ptr<QTreeWidgetItem>> mymap;

当我关闭应用程序时,在unique_ptr的默认析构函数中有一个SegFault。然后,我尝试分解问题,并创建一个执行以下操作的析构函数:

代码语言:javascript
复制
~MyClass() {
    for ( auto x = mymap.begin(); x != mymap.end(); x++  ) {
        QTreeWidgetItem* temp = x->second.release();
        qDebug() << "make sure the pointer is not broken " << temp->isDisabled();
        delete temp;
    }
}

对函数isDisabled()的调用是无用的,只是为了确保指针不会损坏。那么,我可以在指针中使用对象,但是当我试图删除它时,我得到了SegFault。

有什么建议吗?感谢所有人

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 19:22:06

QTreeWidgetItems被设计为归QTreeWidget所有。正如documentation所说,在QTreeWidget的析构函数中,它的所有项都会被删除。在QTreeWidget中存在指向QTreeWidgetItemstd::unique_ptr会创建QTreeWidgetItem的第二个独立所有权,因此会导致相同指针的双重删除。在你的例子中,崩溃发生是因为在手动删除的时候,指针已经被删除了,同时QTreeWidget也持有它。

调用temp->isDisabled()并不能真正检查指针的有效性:如果指针已经被删除,这样的调用只会产生未定义的行为-应用程序可能会崩溃,也可能不会。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45856596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档