如何为父级声明子级是Qt中的共享指针

How to declare for the parent that the child is a shared pointer in Qt

本文关键字:Qt 指针 共享 声明      更新时间:2023-10-16

我有一个如下的类声明:

class GuiImpl : public Gui
              , protected QScrollArea
{
public:
    typedef QScrollArea Base;
public:
    GuiImpl (QWidget *parent)
    : Base(parent)
    , view(0)
    {
    }
    ~GuiImpl () {  }

此类是QScrollArea的子级,该对象将被父级删除。问题是,我将该对象存储在std::shared_ptr中,因此当父对象删除该对象时,计数器不会减少,共享指针随后将尝试再次删除该对象,这会导致我的代码中出现错误。

是否有任何方法可以将子对象声明为父对象的shared_ptr,以便父对象在引用计数器为零时删除对象?

您可以在父级的析构函数中分离子级:

class Parent
{
  // ... Any your code
  QSharedPointer< QObject > child;
  ~Parent()
  {
    child->setParent(nullptr);
  }
};

但这太难看了。相反,您不应该使用共享指针,正如@molbbdilo在评论中所写的那样。如果您不喜欢原始指针,可以使用QPointer包装器。