4

我注意到在 QT 中用 shared_ptr 替换原始指针时,我的代码不再工作了。例如,如果不是

 QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));

我用

 std::shared_ptr<QTreeWidgetItem> vItem(new QTreeWidgetItem(ItemTitle));

然后,要么程序崩溃,要么什么都不做(即使我稍后在代码中使用 .get() 函数从共享指针中获取原始指针)。有谁知道可能是什么原因?

4

1 回答 1

11

将共享指针与 Qt 模型项一起使用会导致所有权冲突:获取您传递给它QTreeWidget的任何内容的所有权。也拥有它的物品。两者都假设他们可以自己删除该项目,并且没有其他人会在他们背后删除它。QTreeWidgetItemstd::shared_ptr

在这种情况下,Qt 取得指针的所有权(其他示例:父QObject项取得其子项的所有权),不能同时使用std::shared_ptr/ QSharedPointerstd::shared_ptr仅在使用std::shared_ptrstd::weak_ptr专门保存指向该特定对象的指针时才能正常工作。

于 2012-12-14T10:43:29.623 回答