哪种智能指针类型?

时间:2018-03-21 19:55:29

标签: c++ c++11 c++14

我对智能指针的使用相当新,并且想确保我不会引入坏习惯。我有一个从工厂创建的对象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;
}

我选择了正确的智能指针,我是否正确分析了这个?我知道这对你们来说非常简单,但我想在我开始做错事之前会问。

1 个答案:

答案 0 :(得分:2)

不理解为什么C通过指针拥有其B个对象,问题不在于是否通过某个基类使用A。实际上,即使shared_ptr<Base>具有非虚拟析构函数,Base也可用于拥有派生类的对象!

真正的问题是B拥有的C个对象的生存期(可能与C的生命周期相同) (已知)比它们所引用的A个对象的短。如果是,您可以坚持unique_ptr<A> 拥有 {em} {/ 1}}和A(或A*使用IInterface*作为两者,尽管您考虑其他可能性,例如更快地销毁单个shared_ptr对象或转移B的所有权到一个可以比观察参考资料更长的地方。