我的问题是,可以使用shared_ptr类中的get()成员的各种方法是什么?为什么我们不能使用删除来删除它?
答案 0 :(得分:11)
如果你有一个带有原始指针的函数
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很常见,但仍然很有用。我建议您观看CppCon 2014中的this part of Herb Sutter's talk,以及周围的部分。
你应该不尝试删除这个指针,智能指针类假设你不会做那样的事情,并且在时机成熟时仍然会在自己的析构函数中释放托管对象(毕竟,你怎么知道你删除了它?)。
智能指针的工作是管理对象并在适当的时候删除它,如果你想手动管理对象的生命周期(通常不推荐),那么使用原始指针。
如果您确实想要拥有unique_ptr
的所有权,可以致电release()
。
答案 1 :(得分:4)
当您需要将原始指针传递给接受此类指针的API时,通常会使用shared_ptr
。
shared_ptr
类管理指针的所有权,因此当智能指针的生命周期结束时,它将自动删除拥有的内存。如果您尝试自己删除内存,那么当{{1}}尝试解除分配时,您将会遇到未定义的行为。