Should I use shared_ptr or unique_ptr?
本问题已经有最佳答案,请猛点这里访问。
我有一个关于EDOCX1,0,EDCX1,1的问题。我知道有很多关于何时使用哪一个的问题,但我仍然不确定我是否理解正确。我在某个地方读到智能指针的默认选择应该是
1 2 3 4 5 6 7 8 9 10 11 12 13 | class B; class A { private: B* b; public: B* getB(); }; A::getB() { return b; } |
所以基本上类
简短回答:视情况而定。
这取决于当拥有的a超出范围时,
- 如果在使用
getB 的结果时仍然存在a,则可以存储unique_ptr 并返回一个普通指针(或者如果getB 不能返回nullptr 的引用)。这表示"A拥有B,其他人都不拥有"。 - 如果在使用/保存
getB 的结果时,a可能超出范围,但b应与a(或不久之后)一起超出范围,则存储shared_ptr 并返回weak_ptr 。 - 如果可能的话,包括
getB 的呼叫者在内的许多对象可能会持有b,并且没有明确的单一所有者,则存储并返回shared_ptr s。
为了举例,我们假设一个指针确实是需要的,而仅仅是
所以,A是B的所有者。
1 2 | private: std::unique_ptr b; |
而
1 2 3 4 5 6 7 8 | public: B& getB(); B& A::getB() { return *b; } |
方案β
A是B的所有者之一。
1 2 | private: std::shared_ptr b; |
A可以把B的所有权给其他人。
1 2 3 4 5 6 7 8 | public: std::shared_ptr getB(); std::shared_ptr A::getB() { return b; } |
这个问题没有足够的信息。
智能指针捕获并实现所有权语义。如果EDCOX1×5的对象拥有EDCOX1×4的对象,那么销毁EDCOX1的5Ω应该破坏EDCOX1×4,然后使用EDCOX1×2。但是EDCX1〔2〕在这里没有很好的返回类型。它只是成员,你仍然会返回一个空指针。
如果获得
我认为你是对的。如果你只把
您返回的是一个空指针,而不是一个