Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪种智能指针类型?_C++_C++11_C++14 - Fatal编程技术网

C++ 哪种智能指针类型?

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

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

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
,你不可能太晚访问它的指针。