SegFault删除QTreeWidgetItem

时间:2017-08-24 08:27:13

标签: c++ qt unique-ptr qtreewidgetitem

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

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。

有什么建议吗?感谢大家

1 个答案:

答案 0 :(得分:1)

let viewController = segue.destination as! NewViewController viewController.delegate = self 旨在由QTreeWidgetItems拥有。正如documentation所述,在QTreeWidget的析构函数中,所有项目都将被删除。在QTreeWidget内存在std::unique_ptrQTreeWidgetItem会创建QTreeWidget的第二个独立所有权,从而导致同一指针的双重删除。在您的示例中发生崩溃是因为在手动删除时,指针已被删除,并且QTreeWidgetItem持有它。

调用QTreeWidget并没有真正检查指针的有效性:如果指针已被删除,这样的调用只会产生未定义的行为 - 应用程序可能会崩溃或者可能不会。