【C++成长之路】C++ 新特性(4)

 前言

    智能指针的认识与学习


为什么要使用智能指针

一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而避免内存泄漏

在c++中,智能指针一共定义了4种:
auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。

不带引用计数的智能指针auto_ptr,unique_ptr

1.auto_ptr智能指针不带引用计数,那么它处理浅拷贝的问题,是直接把前面的auto_ptr都置为nullptr,只让最后一个auto_ptr持有资源。

2.unique_ptr是将左值引用的拷贝构造函数和拷贝赋值运算符删除了,外部不能调用(等同于私有化),防止智能指针浅拷贝问题的发生;但unique_ptr提供了带右值引用的拷贝构造函数和拷贝赋值运算符,这样临时对象就可以使用了,非常有用;

带引用计数的智能指针 : shared_ptr和weak_ptr
带引用计数的智能指针:多个指针可以管理同一个资源:shapred_ptr,weak_ptr;

        当允许多个智能指针指向同一个资源的时候,每一个智能指针都会给资源的引用计数加1,当一个智能指针析构时,同样会使资源的引用计数减1,这样最后一个智能指针把资源的引用计数从1减到0时,就说明该资源可以释放了,由最后一个智能指针的析构函数来处理资源的释放问题,这就是引用计数的概念。这样能够保证在最后一个指向资源的shapred_ptr离开作用域后保证释放资源,而多个shapred_ptr指向同一个资源时候,一个shapred_ptr的析构不会将释放资源,即不会影响其他shared_ptr;通常情况下资源默认删除是delete,也可以自定义删除器来处理如果释放资源;

        要对资源的引用个数进行计数,那么大家知道,对于整数的++或者- -操作,它并不是线程安全的操作,因此shared_ptr和weak_ptr底层的引用计数已经通过CAS操作,保证了引用计数加减的原子特性,因此shared_ptr和weak_ptr本身就是线程安全的带引用计数的智能指针。

        曾经有一道面试的问题这样问“shared_ptr智能指针的引用计数在哪里存放?

        资源引用计数存放在堆内存上
 

总结

深刻理解智能指针

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值