c++11新特性之智能指针(smart ptr)

总结一下c++中一个非常重要的概念,在c++的内存管理中,我们通常是使用new 和delete来动态的管理分配堆上的内存,但是很多情况下需要手动的去释放内存比较麻烦,于是c++提供了智能指针来帮我们管理内存,(离开作用域之后自动delete)避免内存泄漏。

1 unique_ptr,uptr独享一块内存,这块内存只有uptr指针才能访问,它不会和其他的指针共享,它只有通过移动语义来进行内存权限的转移,它的赋值构造和拷贝构造都是私有函数,所以没办法进行指针的拷贝和赋值,移动语义(假设我们有另一个指针想访问uptr的内存,uptr先访问了这块内存,我们可以使用move(uptr)来让另一个指针指向这块内存,并且把uptr指针置null)创建方式 auto uptr=make_unique<int>()。

2 shared_ptr 这个指针通常被用在多线程的情况,有多个对象都想访问同一块内存,这个时候使用多个sptr来满足多个对象的需求,并且通过引用技术(int *n)每多一个sptr指向这块内存,那么n就要+1,释放一块内存n就-1,当n为0时就代表没有对象使用这块内存了,ptr就会释放这块内存和引用计数 auto sptr=make_shared_ptr<int>()。

3weak_ptr 这个指针通常是配合shared_ptr来使用的,它可以当做一个观察shared_ptr指向对象的一个观察者,它不会增加引用计数,它只是观察这个shared_ptr指向的对象当这个对象被释放时weak_ptr也会置为null,一般我们使用weak_ptr来解决shared_ptr的循环引用问题,循环引用就是指,假定我们写了两个类A,B,这两个类里面都有指向对方类的智能指针,当我们用A,B的shared_ptr指向A,B的实例,再用这两个实例里面的shared_ptr指向对方,这个时候,A,B类的智能智能的计数都为2,当离开作用域要析构A,B的时候,只能把他们的计数器都减一,这个时候A,B引用计数都为1不能释放导致内存泄漏,为了解决这种情况我们只需要将其中一个shared_ptr变成weak_ptr,使得其中一个的引用计数为1,这样在析构的时候其中一个为0,那么A,B都能析构了。

weak_ptr<int>wptr=sptr;

如果要是用的话:shared_ptr<int>sptr1=wptr.lock(),这里的lock函数如果wptr观察的内存还没被释放就返回sptr,否则返回空的shared_ptr;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值