Qt raw vs std :: shared_ptr

时间:2012-12-14 10:28:28

标签: c++ qt c++11 shared-ptr

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

 QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));

我用

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

然后,程序崩溃或什么也没做(即使我使用.get()函数来获取 稍后在我的代码中来自共享的原始指针)。有谁知道原因是什么?

1 个答案:

答案 0 :(得分:11)

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

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