如果调用fn()
的结果是const std::shared_ptr<SomeType>
,客户端保存结果的最佳类型是什么?
即:
auto result = fn();
m_myResult = result.get() //or something
m_myResult
应该是什么类型的?
SomeType *
?
还是SomeType
?
还是shared_ptr<SomeType>
?
答案 0 :(得分:2)
shared_ptr<>
用于表示内存资源的共享所有权。指向同一对象的所有(适当创建的)shared_ptr<>
共享其所有权:仅当指向它的最后一个shared_ptr<>
被销毁(或reset()
时才删除该对象,请参阅下文) 。因此,如果你愿意
auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT
raw_ptr->member_func(); // may crash
然后从shared_ptr<>
返回的fn()
会立即被销毁,并且指向的对象可能也会被破坏,或者它可能会在以后的任何时候被销毁。在这种情况下,raw_ptr
将成为dangling pointer。为避免这种情况,您必须通过保持shared_ptr<>
对象保持活动来保持所有权:
auto ptr = fn(); // move shared_ptr<>: pass ownership
ptr->member_func(); // fine (unless fn() returned an empty pointer)
现在由ptr
管理的对象在ptr
本身之前不会被删除,除非您明确reset()
它:
ptr.reset(); // removes ownership from ptr