c++ 智能指针smart pointer

c++中的smart pointer四个智能指针: shared_ptr,unique_ptr,weak_ptr,auto_ptr


前言

为什么要使用智能指针:
智能指针的作用是管理一个指针原始指针申请的空间在函数结束时忘记释放,造成内存泄漏

智能指针可以很大程度上的避免这个问题,因为智能指针就是一个RAII类,当超出了类的作用域是,类会自动调用析构函数,智能指针的析构函数会自动释放资源,不需要手动释放内存空间。


auto_ptr(c++98的,cpp11已抛弃)

采用所有权模式,即移动语义。auto_ptr对STL不兼容,因为STL的对象在进行复制时,就是进行复制,而不是移动语义。

auto_ptr< string> p1(new string("I reigned lonely as a cloud.")) ;
auto_ptr< string> p2;
p2 = p1; //auto_ptr不会报错.
cout<<*p2<<endl;
cout<<*p1<<endl;

此时不会报错,p2剥夺了p1的所有权,但是当程序运行时访问p1将会报错。所以auto_ptr的缺点是:存在潜在的内存崩溃问题!

unique_ptr(替换auto_ptr)

unique_ptr采用所有权模式实现独占式拥有概念,保证同一时间内只有一个智能指针可以指向该对象。 可以移动到新所有者,但不会复制或共享

unique_ptr p3 (new string (“auto”)); //#4
unique_ptr p4; //#5
p4 = p3;//此时会报错!

shared_ptr

shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放
除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。

use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权, 会引起原有对象的引用计数的减少
get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是 一样的.如 shared_ptr sp(new int(1)); sp 与 sp.get()是等价的


weak_ptr

weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象,

它只可以从shared_ptr 或 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。

weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr管理的对象相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。

weak_ptr调用lock函数升级为shared_ptr。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值