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_ptr
到 QTreeWidgetItem
创建了 QTreeWidgetItem
的第二个独立所有权,因此导致同一指针的双重删除。在您的示例中,发生崩溃是因为在手动删除时,指针已经与 QTreeWidget
一起被删除。
调用 temp->isDisabled()
并没有真正检查指针的有效性:如果指针已经被删除,这样的调用只会产生未定义的行为 - 应用程序可能会崩溃,也可能不会。
我在尝试删除 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_ptr
到 QTreeWidgetItem
创建了 QTreeWidgetItem
的第二个独立所有权,因此导致同一指针的双重删除。在您的示例中,发生崩溃是因为在手动删除时,指针已经与 QTreeWidget
一起被删除。
调用 temp->isDisabled()
并没有真正检查指针的有效性:如果指针已经被删除,这样的调用只会产生未定义的行为 - 应用程序可能会崩溃,也可能不会。