unique ptr class 应该如何将它的实例指针传递给它的成员对象

How should a unique ptr class pass its instance pointer to its member objects

unique ptr class 应该如何将它的实例指针传递给它的成员对象。 我想出了下面的方法,想知道有没有更好的方法。 在下面的示例中,对象 f 将其实例 ptr 作为原始指针传递给其成员对象。我想知道这是否可以,或者是否有更好更安全的方法?

class bar;

struct foo
{
    std::unique_ptr<bar> bar_ptr;    
};

struct bar
{
   const foo* raw_foo_ptr;
   bar()  {   }
   void setfoo(const foo* p)
   {raw_foo_ptr = p;}
};

int main()
{
    std::unique_ptr<foo> f(new foo());
    f->bar_ptr.reset(new bar());
    f->bar_ptr->setfoo(f.get());
}

由于您的指针并不是真正唯一的(您希望您的对象由多个指针管理),您应该改用 std::shared_ptr。在这种情况下,bar 实例应该有 weak_ptr 到它的 "parent" 以避免内存泄漏。

我认为在这种情况下,foo 明确拥有 bar 的所有权,并且显然会比 bar 长寿,然后一个非拥有的原始指针指向 [=11= 】 这样就好了。

不过,我写的可能略有不同。如果可能的话,我会在构造时设置后向指针,如果可用的话,我会使用 std::make_unique

class bar;

struct foo
{
    std::unique_ptr<bar> bar_ptr;    
};

struct bar
{
   const foo* raw_foo_ptr;
   bar(const foo* p) : raw_foo_ptr(p) { }
};

int main()
{
    auto f = std::make_unique<foo>();
    f->bar_ptr = std::make_unique<bar>(f.get());
}