如何保存shared_ptr结果?

时间:2017-07-27 20:33:43

标签: c++ shared-ptr

如果调用fn()的结果是const std::shared_ptr<SomeType>,客户端保存结果的最佳类型是什么?

即:

auto result = fn();

m_myResult = result.get() //or something

m_myResult应该是什么类型的? SomeType *? 还是SomeType? 还是shared_ptr<SomeType>

1 个答案:

答案 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