C++11新特性智能指针

1.为什么要引入智能指针


避免程序员申请内存在程序运行结束时忘记释放,造成内存泄漏的情况以及野指针的问题

什么叫内存泄漏

程序员向系统申请内存(new)后忘记释放(delete),导致自己也不能访问这块内存(因为找不到地址了),而系统也不能再次将这块内存分配给需要的程序

什么叫野指针

有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;

2. 智能指针如何避免内存泄漏及野指针

智能指针是一个类,当超出类的作用域后,类会调用析构函数会自动释放申请的内存

3. 智能指针有哪几类,每类有什么特点

有:unique_ptr, shared_pte, weak_ptr

unique_ptr独占资源所有权的指针。

和 shared_ptr 指针最大的不同之处在于,unique_ptr 指针指向的堆内存无法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独自拥有对其所指堆内存空间的所有权。

shared_ptr共享资源所有权的指针

shared_ptr 实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在 “最后⼀个引⽤被销毁”时候释放。

shared_ptr的引用计数

就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向该对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。

weak_ptr弱引用。

weak_ptr 是⽤来解决 shared_ptr 相互引⽤时的死锁问题,如果说两个 shared_ptr 相互引⽤, 那么这两个指针的引⽤计数永远不可能下降为0,也就是资源永远不会释放。它是对对象的⼀ 种弱引⽤,不会增加对象的引⽤计数,和 shared_ptr 之间可以相互转化,shared_ptr 可以直 接赋值给它,它可以通过调⽤ lock 函数来获得shared_ptr。

当两个智能指针都是 shared_ptr 类型的时候,析构时两个资源引⽤计数会减⼀,但是两者引 ⽤计数还是为 1,导致跳出函数时资源没有被释放(的析构函数没有被调⽤),解决办法:把 其中⼀个改为weak_ptr就可以。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值