我对std::unique_ptr
和std::shared_ptr
有疑问。我知道有很多关于何时使用哪一个的问题,但我仍然不确定我是否正确理解它。我在某处读到智能指针的默认选择应该是std::unique_ptr
,但据我了解,根据我的需要,我应该使用std::shared_ptr
。例如,我有:
class B;
class A
{
private:
B* b;
public:
B* getB();
};
A::getB()
{
return b;
}
所以基本上类A
拥有指向类型为B
的对象的指针,并且有一个返回此指针的方法。如果我创建了getter,我假设其他一些类可以访问此指针,因此它应该是shared_ptr
而不是unique_ptr
。我是对的,还是我还没有得到它?
答案 0 :(得分:24)
简短回答:取决于。
这取决于getB
返回的指针是否可以在拥有A超出范围时在某处存储/使用。区别在于所有权而不是你有多少指针。
getB
的结果时A仍然存在,则可以存储unique_ptr
并返回普通指针(如果getB
永远不会返回{{1,则返回引用}})。这表示“A拥有B,没有其他人做”。nullptr
时A可能超出范围,但B应与A一起(或不久之后)超出范围,则存储{{1}并返回getB
。shared_ptr
的来电者)可能会抓住B并且没有明确的单一所有者,请存储并返回weak_ptr
s。答案 1 :(得分:7)
我们假设为了示例,确实需要一个指针,而B b;
只是不切割它(例如,B可能是多态的。)
所以,A是 B的所有者。
private:
std::unique_ptr<B> b;
而getB
提供了该B的视图。
public:
B& getB();
B& A::getB()
{
return *b;
}
A是其中一个 B的所有者。
private:
std::shared_ptr<B> b;
A可以将B的所有权归给他人。
public:
std::shared_ptr<B> getB();
std::shared_ptr<B> A::getB()
{
return b;
}
答案 2 :(得分:2)
您返回一个裸指针,而不是shared_ptr
,因此使指针共享将不会解决任何问题。要么返回shared_ptr
,要么使用unique_ptr
。试着想一想如何才能实现shared_ptr
,我相信这应该清楚我的观点。
答案 3 :(得分:2)
我认为你是对的。
如果您只将B
指针作为A
中的私人成员,我想我会使用std::unqiue_ptr
。
答案 4 :(得分:2)
问题中没有足够的信息。
智能指针捕获并实现所有权语义。如果A
对象拥有B
对象,则销毁A
会破坏B
,然后使用unique_ptr
。但是unique_ptr
在这里没有做出好的回报类型。它只会是成员,你仍然会返回一个裸指针。
如果获得B
表示客户端可以无限期地继续使用B
,那么请使用shared_ptr
,因为这将是共享所有权。