C++ 我应该使用共享\u ptr还是唯一\u ptr?
我有一个关于和的问题。我知道关于什么时候使用哪一个有很多问题,但我仍然不确定我是否理解正确。我在某个地方读到,智能指针的默认选择应该是C++ 我应该使用共享\u ptr还是唯一\u ptr?,c++,c++11,shared-ptr,smart-pointers,unique-ptr,C++,C++11,Shared Ptr,Smart Pointers,Unique Ptr,我有一个关于和的问题。我知道关于什么时候使用哪一个有很多问题,但我仍然不确定我是否理解正确。我在某个地方读到,智能指针的默认选择应该是std::unique\u ptr,但据我所知,出于我的需要,我宁愿使用std::shared\u ptr。例如,我有: class B; class A { private: B* b; public: B* getB(); }; A::getB() { return b; } 所以基本上类A拥有指向B类型的对象的指针,并且有一个方法返回这
std::unique\u ptr
,但据我所知,出于我的需要,我宁愿使用std::shared\u ptr
。例如,我有:
class B;
class A
{
private:
B* b;
public:
B* getB();
};
A::getB()
{
return b;
}
所以基本上类
A
拥有指向B
类型的对象的指针,并且有一个方法返回这个指针。如果我创建getter,我假设其他一些类可以访问这个指针,因此它应该是shared\u ptr
而不是unique\u ptr
。我是对的,还是我还不明白?您返回的是一个裸指针,而不是一个共享的\u ptr
,因此共享指针将无法解决任何问题。返回共享的\u ptr
,或使用唯一的\u ptr
。试着想想怎样才能实现共享,我相信这会让我的观点更清楚。我认为你是对的。
如果您仅将
B
指针描述为A
中的私有成员,我想我会使用std::unqiue_ptr为了示例起见,让我们假设确实需要一个指针,只需B
不会剪切它(例如,可能B是多态的)
情景阿尔法
所以,A是B的所有者
private:
std::unique_ptr<B> b;
情景测试
A是B的所有者之一
private:
std::shared_ptr<B> b;
private:
std::共享的ptr b;
A可以把B的所有权给其他人
public:
std::shared_ptr<B> getB();
std::shared_ptr<B> A::getB()
{
return b;
}
公共:
std::shared_ptr getB();
std::shared_ptr A::getB()
{
返回b;
}
问题中没有足够的信息
智能指针捕获并实现所有权语义。如果A
对象拥有B
对象,那么销毁A
应该销毁B
,然后使用unique\u ptr
。但是unique\u ptr
在这里不是一个好的返回类型。它只会是成员,您仍然会返回一个空指针
如果获得B
意味着客户可以无限期地继续使用B
,那么请使用shared\u ptr
,因为这将是共享所有权。简短回答:视情况而定
这取决于当拥有的A超出范围时,getB
返回的指针是否可以存储/使用在某个地方。区别在于所有权,而不是你有多少个指针
- 如果在使用
getB
的结果时A仍然存在,则可以存储唯一的\u ptr
并返回一个普通指针(如果getB
无法返回nullptr
,则返回一个引用)。这表示“A拥有B,其他人没有”
- 如果在您使用/持有
getB
的结果时,A可能超出范围,但B应该与A一起(或之后不久)超出范围,则存储Ashared\u ptr
并返回Aweak\u ptr
- 如果可能有许多对象,包括
getB
的调用者,可能会保留到B,并且没有明确的单一所有者,则存储并返回shared\u ptr
s
如果需要共享指针,请使用std::shared\u ptr
。如果您不需要共享指针,请使用std::unique_ptr
。可能的dup of和/或@JoachimPileborg如果他像他一样返回一个裸指针,那么使用shared_ptr
场景alpha不考虑b为空的可能性。它取决于这种可能性和返回的ptr/ref的使用情况,如果getB
应该返回一个引用、一个普通指针或一个弱ptr
,后者当然需要一个存储的共享的ptr
public:
std::shared_ptr<B> getB();
std::shared_ptr<B> A::getB()
{
return b;
}