适合组合的智能指针
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
(没有 A
的 C
没有任何意义)。 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
之前必须删除所有所有者的意义上)。
我有一个 class 的继承结构:
struct A {
ObjectByValue obv;
};
struct B : A {
OtherThings ot;
};
另一个 class 想要指向 A
的指针:
struct C {
smartpointer<A> a;
};
当我创建 C
时,我传入了一个已经创建的 B
(作为指向 A
的指针)。 C
不拥有 A
(没有 A
的 C
没有任何意义)。 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
之前必须删除所有所有者的意义上)。