对c++中的smart pointer四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解
C++ 提供了四种类型的智能指针:auto_ptr
,unique_ptr
,shared_ptr
和 weak_ptr
。它们都位于 <memory>
头文件中,并在 std
命名空间下。这些智能指针的主要目标是管理动态分配的内存,使得在出现异常或者提前返回函数时,能够自动地释放这些内存,避免内存泄露。
auto_ptr
:这是 C++98 标准库中的一个智能指针,但在 C++11 中被废弃,C++17 中被移除。auto_ptr
采用了一种所谓的所有权语义,即在任何时刻,auto_ptr
对象都拥有(也就是说,当其被销毁时会删除)其所指向的对象。然而,这种所有权可以被转移,这导致了一些非常违反直觉的行为。因此,除非你完全确定你知道你在做什么,否则不应该使用auto_ptr
。-
unique_ptr
:这是 C++11 中引入的一个智能指针,它替代了auto_ptr
。unique_ptr
对象拥有其所指向的对象,但所有权不能被复制,只能通过std::move
转移。这意味着在任何时刻,最多只能有一个unique_ptr
指向一个给定的对象。这使得unique_ptr
成为管理在堆上创建的单一对象或者原始数组的理想选择。 -
shared_ptr
:这是 C++11 中引入的另一个智能指针,它实现了所谓的共享所有权语义。也就是说,多个shared_ptr
对象可以指向同一个对象,该对象在最后一个shared_ptr
被销毁时删除。shared_ptr
使用了引用计数来跟踪有多少个shared_ptr
对象当前指向一个对象。 -
weak_ptr
:这是 C++11 中引入的第三种智能指针,它是为配合shared_ptr
使用的。一个weak_ptr
对象可以指向一个由shared_ptr
对象拥有的对象,但它并不参与所有权的管理。也就是说,一个weak_ptr
对象的存在不会阻止其指向的对象被删除。这使得weak_ptr
成为解决shared_ptr
中可能出现的循环引用问题的理想工具。
一般来说,你应该优先使用 unique_ptr
或 shared_ptr
。如果你需要使用弱引用(例如,为了解决循环引用的问题),则应使用 weak_ptr
。避免使用 auto_ptr
,因为它已经被废弃,并且其行为可能会导致一些违反直觉的结果。