Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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类的get()成员有什么用途?_C++_C++11_Shared Ptr_Smart Pointers - Fatal编程技术网

C++ 共享_ptr类的get()成员有什么用途?

C++ 共享_ptr类的get()成员有什么用途?,c++,c++11,shared-ptr,smart-pointers,C++,C++11,Shared Ptr,Smart Pointers,我的问题是,可以使用共享的\u ptr类中的get()成员的各种方式是什么?为什么我们不能使用delete来删除它呢?如果你有一个函数使用一个原始指针 void f(T *t); // non-owning pointer 您有一个指向T对象的智能指针,您可以使用get() std::shared_ptr sp{new T};//或唯一的 //f(sp);//不好,类型不匹配 f(sp.get());//而是传递原始指针 采用原始指针的API很常见,而且仍然很有用。我建议您观看CppCon

我的问题是,可以使用共享的\u ptr类中的get()成员的各种方式是什么?为什么我们不能使用delete来删除它呢?

如果你有一个函数使用一个原始指针

void f(T *t); // non-owning pointer
您有一个指向
T
对象的智能指针,您可以使用
get()

std::shared_ptr sp{new T};//或唯一的
//f(sp);//不好,类型不匹配
f(sp.get());//而是传递原始指针
采用原始指针的API很常见,而且仍然很有用。我建议您观看CppCon 2014,可能还有它周围的部分

您应该不要尝试删除此指针,智能指针类假定您不会执行类似操作,并且在时间到来时仍将在其自己的析构函数中释放托管对象(毕竟,它怎么知道您删除了它?)

智能指针的任务是管理对象并在正确的时间删除它,如果您想手动管理对象的生存期(通常不推荐),则使用原始指针


如果您确实想拥有
唯一的\u ptr
的所有权,可以通过调用
release()

来实现,通常在需要将原始指针传递给接受该指针的API时,您会使用
get()


shared_ptr
类管理指针的所有权,因此它将在智能指针的生命周期结束时自动删除所拥有的内存。如果您自己尝试删除内存,那么当
shared\u ptr
尝试解除分配时,您将出现未定义的行为。

当您需要访问托管原始指针时,可以使用
get()
。如果你
删除sp.get()你很有可能,也应该得到未定义的行为来使用需要原始指针的API这让我想起许多月前(在boost::shared_ptr之前),当我滚动我自己的refcounted指针时。我将原始指针访问器命名为“very_bad_public_method”,因为您可以对共享指针使用自定义删除器,所以通过原始指针释放对象(即使它是唯一拥有的)并不是件小事。
std::shared_ptr<T> sp{new T};  // or unique_ptr
//f(sp); // no good, type mismatch
f(sp.get()); // passes the raw pointer instead