【问题标题】:Qt raw vs std::shared_ptrQt raw vs std::shared_ptr
【发布时间】:2012-12-14 10:28:28
【问题描述】:

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

 QTreeWidgetItem* vItem(new QTreeWidgetItem(ItemTitle));

我用

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

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

【问题讨论】:

  • 你为什么首先使用带有 Qt 模型项的智能指针?你可能不应该那样做。
  • 我不确定原始指针是否会导致内存泄漏...
  • 这始终是一个有效的担忧,但解决方案不是添加随机“修复”,而是了解对象的生命周期和所有权状态。但是,是的,知道什么是正确的事情并不总是那么容易,尤其是在 C++ 中使用某些框架时......

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2013-06-07
    相关资源
    最近更新 更多