【发布时间】:2018-08-31 02:40:13
【问题描述】:
我对智能指针的使用相当陌生,并且想确保我没有引入坏习惯。我有一个从工厂创建并添加到队列中的对象 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;
}
我是否选择了正确的智能指针,我是否正确分析了这一点?我知道这对你们来说非常简单,但我想在我开始做错事之前先问一下。
【问题讨论】:
-
为什么 C 存储
unique_ptr<B>而不是B? -
查看 Herb Sutter 的演讲 Leak-Freedom in C++... By Default
-
拥有某物时使用
std::unique_ptr;用于观察某物的原始指针和std::shared_ptr,当您需要重新设计时。 -
@Taztingo 视情况而定。如果你在一个对象中存储一些东西,我通常会推荐指针而不是引用,因为引用不能被反弹,所以如果你使用它们,你就不能复制对象。
-
仍然不清楚为什么您需要任何指向
B的指针。