我在删除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。
有什么建议吗?感谢所有人
发布于 2017-08-24 19:22:06
QTreeWidgetItems被设计为归QTreeWidget所有。正如documentation所说,在QTreeWidget的析构函数中,它的所有项都会被删除。在QTreeWidget中存在指向QTreeWidgetItem的std::unique_ptr会创建QTreeWidgetItem的第二个独立所有权,因此会导致相同指针的双重删除。在你的例子中,崩溃发生是因为在手动删除的时候,指针已经被删除了,同时QTreeWidget也持有它。
调用temp->isDisabled()并不能真正检查指针的有效性:如果指针已经被删除,这样的调用只会产生未定义的行为-应用程序可能会崩溃,也可能不会。
https://stackoverflow.com/questions/45856596
复制相似问题