Smart pointer 简介
智能指针...
Smart Pointer
智能指针是行为类似于指针的类对象,但这种对象还有其他功能。
- 下面我将将会分别介绍几种不同的智能指针
auto_ptr
- 包含在
<memory>
头文件中 - 在
C++98
时被引入 - 已经在
C++11
是被弃用 - 在
C++17
被移除
特点
auto_ptr
没有使用引用计数,在复制构造函数和赋值构造函数中将对象所有权转移auto_ptr
不能指向数组,因为auto_ptr
在析构的时候只是调用delete
,而数组应该要调用delete[]
auto_ptr
不能和标准容器(vector,list,map…)一起使用- 由于
auto_ptr
在复制和赋值构造中将转移所有权
- 由于
unique_ptr
- 包含在
<memory>
头文件中 - 在
C++11
时被引入 - 用于解决
auto_ptr
的拷贝问题
特点
- 不支持拷贝操作,只能进行所有权的转移
std::unique_ptr
通常用于管理对象的生命周期,包括: 通过保证正常退出和异常退出时的删除,为处理具有动态生命周期的对象的类和函数提供异常安全性- 对于自定义的类对象,支持提供自定义的删除器
- 常用于单线程
- 可以为空
shared_ptr
- 包含在
<memory>
头文件中 - 在
C++11
时被引入 - 支持拷贝和复制
特点
- 支持拷贝和复制
- 对于自定义的类对象,支持提供自定义的删除器
- 常用于多线程
- 多个对象可以共享所有权
- 可以为空
weak_ptr
- 包含在
<memory>
头文件中 - 在
C++11
时被引入 - 它是对
std::shared_ptr
管理的对象的非拥有引用,必须将其转换为std::shared_ptr
才能访问引用的对象
特点
- 解决
shared_ptr
引起的循环引用问题 - 获取某个
shared_ptr
指向对象的临时所有权,在shared_ptr
对象被销毁是可以延长此对象的生命周期