我有一个类的继承结构:
struct A {
ObjectByValue obv;
};
struct B : A {
OtherThings ot;
};
另一个类需要一个指向A
的指针:
struct C {
smartpointer<A> a;
};
当我创建C
时,我传入一个已经创建的B
(作为指向A
的指针)。 C
不拥有 A
(并且没有 A
的 C
没有任何意义)。 C
将(希望)总是在 A
指针被释放之前消亡。我应该使用智能指针吗?引用?原始指针?这里有最佳实践吗?
最佳答案
答案很大程度上取决于什么拥有 A
实例。
- 如果“没有人”拥有
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
)。
关于c++ - 适合构图的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28595337/