C++ 共享_ptr类的get()成员有什么用途?
我的问题是,可以使用共享的\u ptr类中的get()成员的各种方式是什么?为什么我们不能使用delete来删除它呢?如果你有一个函数使用一个原始指针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
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