关于c ++:哪种智能指针类型?

Which smart pointer type?

本问题已经有最佳答案,请猛点这里访问。

我对智能指针的使用还比较陌生,我想确保不会引入坏习惯。我有一个从工厂创建并添加到队列中的对象A。然后从另一个线程读取该队列,此时我认为使用唯一的指针是完全有效的。

1
2
3
4
5
6
7
8
9
10
11
struct IInterface
{

}

class A : public IInterface
{

}

std::queue<std::unique_ptr<A>> queue;

然而,在构造A的时候,我意识到我需要一个C.C类,它包含一个B类的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
class A : public IInterface
{
    C c;
}

class B
{
}

class C
{
    List<unqiue_ptr> b;
}

对我来说,这看起来还可以,因为我们已经定义了所有权。但是,我不确定当类B现在需要一个指向iInterface的指针时需要使用什么指针,而a型恰好实现了这一点。我要把它变成一个共享资源吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}

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


抛开C通过指针拥有其B对象的原因,问题不在于A是否通过某些基类使用。实际上,即使Base具有非虚拟析构函数,也可以使用shared_ptr拥有派生类的对象!

真正的问题是,C拥有的B物体的寿命(可能与C的寿命相同)是否(已知)短于它们所指的A物体的寿命。如果是的话,你可以坚持使用unique_ptr拥有AA*IInterface*使用它们。如果没有,您应该考虑将shared_ptr用于两者,尽管您也应该考虑其他可能性,例如提前销毁单个B对象或将A的所有权转移到一个可以比观察到的参考资料更为长久的地方。