C++ 哪种智能指针类型?
我对智能指针的使用还比较陌生,我想确保我没有引入坏习惯。我有一个从工厂创建并添加到队列的对象A。然后从另一个线程读取该队列,此时我认为使用唯一的\u ptr是完全有效的C++ 哪种智能指针类型?,c++,c++11,c++14,C++,C++11,C++14,我对智能指针的使用还比较陌生,我想确保我没有引入坏习惯。我有一个从工厂创建并添加到队列的对象A。然后从另一个线程读取该队列,此时我认为使用唯一的\u ptr是完全有效的 struct IInterface { } class A : public IInterface { } std::queue<std::unique_ptr<A>> queue; 结构界面 { } A类:公共接口 { } std::队列; 然而,在构建A的过程中,我意识到我需要一个C类。C
struct IInterface
{
}
class A : public IInterface
{
}
std::queue<std::unique_ptr<A>> queue;
结构界面
{
}
A类:公共接口
{
}
std::队列;
然而,在构建A的过程中,我意识到我需要一个C类。C类获取它所拥有的B类的列表
class A : public IInterface
{
C c;
}
class B
{
}
class C
{
List<unqiue_ptr<B>> b;
}
A类:公共界面
{
C C;
}
B类
{
}
C类
{
名单b;
}
对我来说,这看起来还可以,因为我们已经定义了所有权。然而,我不确定当类B现在需要一个指向IIInterface的指针时需要使用什么指针,而a正好实现了IIInterface。我是否将其作为共享的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;
}
结构界面
{
}
A类:公共接口
{
C C;
}
std::队列;
B类
{
共享ptr a;
}
C类
{
名单b;
}
我是否选择了正确的智能指针?我是否正确地分析了它?我知道这对你们来说非常简单,但我想在我开始做错事之前我会问一下。撇开为什么
C
通过指针拥有B
对象不谈,问题不在于a
是否通过某个基类使用。实际上,shared_ptr
可以用来拥有派生类的对象,即使Base
有一个非虚拟析构函数
真正的问题是a
C
拥有的B
对象的生存期(可能与C
的生存期相同)是否(已知)短于它们所引用的a
对象的生存期。如果是,您可以坚持使用unique\u ptr
来拥有A
s和A*
(或IInterface*
)来使用它们。如果不是,您应该考虑使用<代码> SydDypPT/<代码>,虽然你也应该考虑其他的可能性,比如破坏个人<代码> b>代码>对象,或者将<代码> a <代码>的所有权转移到一个可以超过它的观察引用的地方。为什么c存储>代码> UNQuYGYPTR <代码>而不是<代码> B<代码>?参见Habor萨特的会话使用std::unique_ptr
当你拥有某物时;当您需要重新设计时,用于观察某物和std::shared_ptr
的原始指针。@Taztingo取决于具体情况。如果要在对象中存储某些内容,我通常建议使用指针而不是引用,因为引用不会反弹,因此如果使用它们,就不能复制对象。现在还不清楚为什么需要指向B
的任何类型的指针。你是指短于或等于生存期,然后使用unique吗?我的生命正好是相等的。@Taztingo:两个对象同时被销毁是很少见的:我想到的唯一一种情况是销毁一个没有析构函数的数组。但如果这能以某种方式发生,那么等于就足够了。我想在我的例子中,A,B,C都是同时生成的,而A恰好是传入的。一旦A被销毁,其他的就不再使用了。@Taztingo:在引用对象被销毁后,B::A
(对于任何类型的B
)不被访问(甚至可以说,将其与nullptr
!)就足够了。我写了“更短的使用寿命”作为安全性的设计准则:如果你已经破坏了B
,你不可能太晚访问它的指针。