我的问题是,shared_ptr类中的get()成员可以通过哪些方式使用?为什么我们不能使用删除来删除它?
如果你有一个函数接受原始指针
void f(T *t); // non-owning pointer
你有一个指向T
对象的智能指针,你可以通过使用get()
将其传递给该函数
std::shared_ptr<T> sp{new T{}}; // or unique_ptr
//f(sp); // no good, type mismatch
f(sp.get()); // passes the raw pointer instead
采用原始指针的 API 很常见,但仍然有用。 我建议你看一下Herb Sutter在CppCon 2014上的演讲的这一部分,可能还有围绕它的部分。
您不应该尝试删除此指针,智能指针类假定您不会执行类似操作,并且智能指针仍将在时机成熟时释放其自己的析构函数中的托管对象(毕竟,它怎么知道您删除了它?
智能指针的工作是管理对象并在正确的时间将其删除,如果要手动管理对象的生存期(通常不推荐),请使用原始指针。
如果您确实想获得unique_ptr
的所有权,可以通过调用 release()
来实现。
当您需要将原始指针传递给接受此类指针的 API 时,您会使用 get()
。
shared_ptr
类管理指针的所有权,因此它将在智能指针的生存期结束时自动删除拥有的内存。如果您尝试自己删除内存,那么当shared_ptr
尝试释放时,您最终会遇到未定义的行为。