C++智能指针

0.前言

C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。

1.shared_ptr

1.1设计原理

多个shared_ptr可以指向同一个对象,当最后一个shared_ptr在作用域范围内结束时,对象才会被自动释放。

1.2shared_ptr原理

  • 一个shared_ptr会对一个对象产生强引用(strong reference)
  • 每个对象都有个与之对应的强引用计数,记录着当前对象被多少个shared_ptr强引用着。可以通过shared_ptr的use_count函数获得强引用计数 
  • 当有一个新的shared_ptr指向对象时,对象的强引用计数就会+1
  • 当有一个shared_ptr销毁时(比如作用域结束),对象的强引用计数就会-1
  • 当一个对象的强引用计数为0时(没有任何的shared_ptr指向对象时),对象就会自动销毁(析构)

如下所示:

分别创建四个shared_ptr指针指向同一个对象,每次调用后强引用的次数+1,最后p4销毁后才析构

1.3思考题

这样的代码存在问题,在第一次智能指针被销毁时,对象的强引用次数为0,此时p析构了。

1.4shared_ptr的循环引用

如图当两个智能指针指向对方时,作用域结束后指针销毁,对象不会自动析构

此时需要用到weak_ptr来解决这个问题

2.weak_ptr

  • weak_ptr会对一个对象产生弱引用

  • weak_ptr可以指向对象解决shared_ptr的循环引用问题

    此时的内存图如图:

    当栈空间的智能指针销毁时,堆空间的Person对象强引用次数为0,Car对象的强引用次数为1,Person先析构,然后Car强引用次数为0,Car析构

3.unique_ptr

  • unique_ptr也会对一个对象产生强引用,它可以确保同一时间只有1个指针指向对象
  • 当unique_ptr销毁时(作用域结束时),其指向的对象也就自动销毁了
  • 可以使用std:move函数转移unique_ptr的所有权

        好了,对于智能指针的初步的学习就结束了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值