SegFault 删除 QTreeWidgetItem

SegFault deleting QTreeWidgetItem

我在尝试删除 QTreeWidgetItem 的代码中遇到了一个奇怪的问题。特别是,我的 class:

中有这个
std::map<int, std::unique_ptr<QTreeWidgetItem>> mymap;

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

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