【问题标题】:How should a unique ptr class pass its instance pointer to its member objects一个唯一的ptr类应该如何将它的实例指针传递给它的成员对象
【发布时间】:2015-09-13 16:29:41
【问题描述】:

一个唯一的ptr类应该如何将它的实例指针传递给它的成员对象。 我想出了以下方法,想知道是否有更好的方法。 在以下示例中,对象 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());
}

【问题讨论】:

  • 问题到底是什么?是“如何将非拥有指针传递给另一个对象?”。什么对你来说更好?更安全?

标签: c++ c++11 smart-pointers


【解决方案1】:

我认为在这种情况下,foo 拥有bar 的明确所有权并且显然会比bar 寿命更长,然后像这样指向foo 的非拥有原始指针很好。

虽然,我的写法可能略有不同。如果可能的话,我会在构建时设置后向指针,如果可用,我会使用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());
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 其他对象不拥有它。这就是为什么它是一个恒定的原始指针。不知道这样行不行?如果我将其设为共享指针,那么 bar 会将其作为弱指针,我正确吗?
    • 这是一个典型的例子,说明shared_ptr 是一个非常糟糕的主意。如果foo 拥有bar 并且bar 拥有foo 那么你实际上有内存泄漏。一种解决方法是改用weak_ptr。在这种情况下,虽然我认为原始指针很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多