智能指针可以粗略的看成是new和delete的结合体,可以自动地分配内存和清理内存。
下面,我们将简单的介绍unique_ptr,shared_ptr和weak_ptr这三种智能指针
首先,我们需要引入管理智能指针的库文件
#include<memory>
让我们先创建一个简单的类来做测试
unique_ptr
如图为基本的使用方式
输出如下
需要注意的是,unique_ptr必须显式调用,隐式调用会报错
同时,unique_ptr不可以被复制
shared_ptr
如果我们需要指针在对象之间共享,那么shared_ptr就是个很好的选择。
shared_ptr使用的是引用计数,可以跟踪指针有多少个引用,当引用计数为0的时候,释放内存。同时它也会分配一块内存(控制块),用来存储引用计数,因此如无必要,出于效率的角度,优先使用unique_ptr。
上面是一个简单的shared_ptr实现,大致流程如下:
- 第一作用域:什么都没有发生
- 第二作用域:创建共享指针shared_ptr0,此时引用计数为1
- 第三作用域:创建共享指针shared_ptr1并复制给shared_ptr0,此时引用计数为2,调用构造函数
- 第二作用域:shared_ptr1死掉,此时引用计数为1
- 第一作用域:shared_ptr0死掉,此时引用计数为0,调用析构函数
weak_ptr
同样可以共享,但不会计入到shared_ptr的引用计数中
在上面weak_ptr的实现中
- 第一作用域:什么都没有发生
- 第二作用域:创建弱指针shared_ptr0,此时引用计数为0
- 第三作用域:创建共享指针shared_ptr1并复制给shared_ptr0,此时引用计数为1,调用构造函数
- 第二作用域:shared_ptr1死掉,此时引用计数为0,调用析构函数
到这里就结束啦,如有纰漏,请指正。