shared_ptr class 中的 get() 成员有什么用?
What are the uses of get() member from the shared_ptr class?
我的问题是 shared_ptr class 的 get() 成员有哪些不同的使用方式?为什么我们不能使用 delete 来删除它?
如果你有一个接受原始指针的函数
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()
.
来实现
通常,当您需要将原始指针传递给接受此类指针的 API 时,您会使用 get()
。
shared_ptr
class管理指针的所有权,所以当智能指针的生命周期结束时,它会自动删除拥有的内存。如果您尝试自己删除内存,那么当 shared_ptr
尝试解除分配时,您将遇到未定义的行为。
我的问题是 shared_ptr class 的 get() 成员有哪些不同的使用方式?为什么我们不能使用 delete 来删除它?
如果你有一个接受原始指针的函数
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()
.
通常,当您需要将原始指针传递给接受此类指针的 API 时,您会使用 get()
。
shared_ptr
class管理指针的所有权,所以当智能指针的生命周期结束时,它会自动删除拥有的内存。如果您尝试自己删除内存,那么当 shared_ptr
尝试解除分配时,您将遇到未定义的行为。