适合组合的智能指针

Appropriate smart pointer for composition

我有一个 class 的继承结构:

struct A {
    ObjectByValue obv;
};

struct B : A {
    OtherThings ot;
};

另一个 class 想要指向 A 的指针:

struct C {
    smartpointer<A> a;
};

当我创建 C 时,我传入了一个已经创建的 B(作为指向 A 的指针)。 C 不拥有 A(没有 AC 没有任何意义)。 C 将(希望)总是在 A 指针被释放之前死亡。我应该使用智能指针吗?参考?原始指针?这里有最佳实践吗?

答案很大程度上取决于什么拥有A实例。

  • 如果 "nobody" 拥有 A 实例,则它必须是全局或静态分配的。在这种情况下,您应该使用普通引用 (A&)。这也断言该对象永远不会为空(即它在 C 的生命周期内始终存在)。

否则,对象是动态分配的:

  • 如果某个其他对象拥有 A 实例,并且可以证明比 C 还长,那么情况与静态分配的情况非常相似。所有者应该有一个unique_ptr<A>,并且C可以有一个简单的参考。
  • 如果其他对象拥有 A 实例,但可能会或可能不会比 C 长,那么所有者应该使用 shared_ptr<A>C 应该使用weak_ptr<A>。如果所有者在 C 之前被删除,那么 weak_ptr 将自动变为 null。
  • 如果 C 实例和其他所有者之间的所有权应该 共享 ,那么您应该在两个地方都使用 shared_ptr<A>。然后,C 实例保证其 A 成员始终有效,并共享所有权(在删除 A 之前必须删除所有所有者的意义上)。