我注意到在QT中用shared_ptr替换原始指针时,我的代码不再起作用了。 例如,如果不是
QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));
我用
std::shared_ptr<QTreeWidgetItem> vItem(new QTreeWidgetItem(ItemTitle));
然后,程序崩溃或什么也没做(即使我使用.get()函数来获取 稍后在我的代码中来自共享的原始指针)。有谁知道原因是什么?
答案 0 :(得分:11)
将共享指针与Qt模型项一起使用会导致所有权冲突:QTreeWidget
取得您传递给它的任何QTreeWidgetItem
的所有权。 std::shared_ptr
也拥有其项目。两者都假设他们可以自己删除该项目,并且没有其他人会在他们背后删除它。
在这种情况下,Qt获取指针的所有权(其他示例:父QObject
取得其子女的所有权),但不能同时使用std::shared_ptr
/ QSharedPointer
。 std::shared_ptr
仅在使用std::shared_ptr
和std::weak_ptr
专门用于保存指向该特定对象的指针时才有效。