gpt4 book ai didi

c++ - SegFault 删除 QTreeWidgetItem

转载 作者:行者123 更新时间:2023-11-28 05:01:21 25 4
gpt4 key购买 nike

我在试图删除 QTreeWidgetItem 的代码中遇到了一个奇怪的问题。特别是,我在类里面有这个:

std::map<int, std::unique_ptr<QTreeWidgetItem>> mymap;

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

~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。

有什么建议吗?感谢大家

最佳答案

QTreeWidgetItems 被设计为由 QTreeWidget 拥有。作为documentation说,在 QTreeWidget 的析构函数中,它的所有项目都被删除了。在 QTreeWidget 中存在 std::unique_ptrQTreeWidgetItem 创建了 QTreeWidgetItem 的第二个独立所有权,因此导致同一指针的双重删除。在您的示例中,发生崩溃是因为在手动删除的那一刻,指针已经连同持有它的 QTreeWidget 一起被删除。

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

关于c++ - SegFault 删除 QTreeWidgetItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com