如何保存shared_ptr结果?

How to save shared_ptr result?

本文关键字:ptr 结果 shared 何保存 保存      更新时间:2023-10-16

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

即:

auto result = fn();
m_myResult = result.get() //or something

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

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

然后从fn()返回的shared_ptr<>立即被销毁,指向的对象也可能被销毁,或者它可能在以后随时被销毁。在这种情况下,raw_ptr将成为悬而未决的指针。为避免这种情况,您必须通过保持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