Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何保存共享的ptr结果?_C++_Shared Ptr - Fatal编程技术网

C++ 如何保存共享的ptr结果?

C++ 如何保存共享的ptr结果?,c++,shared-ptr,C++,Shared Ptr,如果调用fn()的结果是const std::shared\u ptr,客户端保存结果的最佳类型是什么 即: m_myResult应该是什么类型? SomeType*? 或者SomeType? 或者shared\u ptr?A用于表示内存资源的共享所有权。指向同一对象的所有(适当创建的)shared\u ptrs共享其所有权:仅当指向该对象的最后一个shared\u ptr被销毁(或是reset(),见下文)时,才会删除该对象。因此,如果你愿意 auto raw_ptr = fn().get()

如果调用
fn()
的结果是
const std::shared\u ptr
,客户端保存结果的最佳类型是什么

即:

m_myResult
应该是什么类型?
SomeType*
? 或者
SomeType
? 或者
shared\u ptr

A用于表示内存资源的共享所有权。指向同一对象的所有(适当创建的)
shared\u ptr
s共享其所有权:仅当指向该对象的最后一个
shared\u ptr
被销毁(或是
reset()
,见下文)时,才会删除该对象。因此,如果你愿意

auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT
raw_ptr->member_func();    // may crash
现在,由
ptr
管理的对象在
ptr
本身被删除之前不会被删除,除非您明确指定:

用于表示内存资源的共享所有权。指向同一对象的所有(适当创建的)
shared\u ptr
s共享其所有权:仅当指向该对象的最后一个
shared\u ptr
被销毁(或是
reset()
,见下文)时,才会删除该对象。因此,如果你愿意

auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT
raw_ptr->member_func();    // may crash
现在,由
ptr
管理的对象在
ptr
本身被删除之前不会被删除,除非您明确指定:


问问自己为什么函数返回共享指针。为什么不
std::shared\u ptr
?返回
T*
@mch我不认为OP是使用
result.get()
设置的,而是建议它来确定它是否是一个可行的解决方案。@user5773369您不应该将
std::shared_ptr
视为一个新负担。这是一个很棒的新功能,旨在让你的生活更轻松。它只是一个管理结果生命周期的对象。将它用作任何其他指针,您不必担心删除它。问问自己为什么函数返回共享指针。为什么不
std::shared_ptr
?返回
T*
@mch我不认为OP是使用
result.get()
设置的,而是建议它来确定它是否是一个可行的解决方案。@user5773369您不应该将
std::shared_ptr
视为一个新负担。这是一个很棒的新功能,旨在让你的生活更轻松。它只是一个管理结果生命周期的对象。将它用作任何其他指针,您不必担心删除它。
auto ptr = fn();          // move shared_ptr<>: pass ownership
ptr->member_func();       // fine (unless fn() returned an empty pointer)
ptr.reset();              // removes ownership from ptr