我在代码中遇到一个奇怪的问题,试图删除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。
有什么建议吗?感谢大家
答案 0 :(得分:1)
let viewController = segue.destination as! NewViewController
viewController.delegate = self
旨在由QTreeWidgetItems
拥有。正如documentation所述,在QTreeWidget
的析构函数中,所有项目都将被删除。在QTreeWidget
内存在std::unique_ptr
到QTreeWidgetItem
会创建QTreeWidget
的第二个独立所有权,从而导致同一指针的双重删除。在您的示例中发生崩溃是因为在手动删除时,指针已被删除,并且QTreeWidgetItem
持有它。
调用QTreeWidget
并没有真正检查指针的有效性:如果指针已被删除,这样的调用只会产生未定义的行为 - 应用程序可能会崩溃或者可能不会。