我对智能指针的使用相当新,并且想确保我不会引入坏习惯。我有一个从工厂创建的对象A,并添加到队列中。然后从另一个线程读取此队列,此时我认为使用unique_ptr是完全有效的。
struct IInterface
{
}
class A : public IInterface
{
}
std::queue<std::unique_ptr<A>> queue;
然而,在构建A时,我意识到我需要一个C类.C获取它所拥有的B列表。
class A : public IInterface
{
C c;
}
class B
{
}
class C
{
List<unqiue_ptr<B>> b;
}
对我来说这看起来还不错,因为我们已经定义了所有权。但是,当B类现在需要一个指向IInterface的指针时,我不确定需要使用什么指针,A恰好实现了。我是否将它设为shared_ptr?
struct IInterface
{
}
class A : public IInterface
{
C c;
}
std::queue<std::shared_ptr<A>> queue;
class B
{
shared_ptr<IInterface> a;
}
class C
{
List<unique_ptr<B>> b;
}
我选择了正确的智能指针,我是否正确分析了这个?我知道这对你们来说非常简单,但我想在我开始做错事之前会问。
答案 0 :(得分:2)
不理解为什么C
通过指针拥有其B
个对象,问题不在于是否通过某个基类使用A
。实际上,即使shared_ptr<Base>
具有非虚拟析构函数,Base
也可用于拥有派生类的对象!
真正的问题是B
拥有的C
个对象的生存期(可能与C
的生命周期相同) (已知)比它们所引用的A
个对象的短。如果是,您可以坚持unique_ptr<A>
拥有 {em} {/ 1}}和A
(或A*
)使用他们。如果没有,您应该考虑使用IInterface*
作为两者,尽管您还考虑其他可能性,例如更快地销毁单个shared_ptr
对象或转移B
的所有权到一个可以比观察参考资料更长的地方。