首页 > 编程语言 >C++智能指针

C++智能指针

时间:2023-09-01 20:55:22浏览次数:37  
标签:p1 指向 C++ 智能 内存 shared ptr 指针

一、常规指针的缺点

  • 当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free\delete\delete[]语句忘记执行或者无法执行,形成内存泄漏

二、智能指针的优点

  • 智能指针是一个封装了常规指针的类类型对象,并且重载了 * 和 -> 运算符,使用起来和常规指针相近

  • 当智能指针离开作用域时,它的析构函数必定执行,从而在析构函数中执行释放常规指针的操作,这样就做到了自动释放的效果,从而避免内存泄漏

  • 智能指针是一个类模板

三、C++STL中的提供的智能指针

auto_ptr\shared_ptr\unique_ptr\weak_ptr,在C++98标准中只有第一个auto_ptr,C++11只支持后三个,第一个被弃用,使用会产生警告,需要提供头文件 < memory >

Ⅰ.auto_ptr

采用独占拥有模式,不能同时有多个auto_ptr指向同一个内存,但是不能完全实现,有时会指向同一个内存,有隐患

auto_ptr<int> p1(new int(123));
auto_ptr<int> p2;    //可以悬空
p2 = p1;    //允许,但p1转移所有权给p2,p1可能变成空指针
*p1;    //可能段错误

注意:使这种独占式不一定成立,p1是否转移给p2不确定

使用格式

  1. auto_ptr<类型> 对象名(new 类型名);

  2. 类型* p = new 类型;
    auto_ptr<类型> 对象名(p);

Ⅱ.unique_ptr 独享指针

  • 是auto_ptr的升级,完全实现独占式拥有模式,保证同一时间中只有一个unique_ptr指向某个内存

  • 通过把拷贝构造、赋值操作函数声明为delete来实现不能给另一个unique_ptr对象赋值的效果

    unique_ptr<int> p1(new int);
    unique_ptr<int> p2;
    p2 = p1;    //报错
    p2 = unique_ptr<int>(new int);    //允许指向匿名unique_ptr对象的内存
    
  • 可以通过C++的全局函数 move() 来转移内存的指向给另一个unique_ptr

    p2 = move(p1);    //让p2指向p1原来的内存,p1一定会变成空指针,p2在改变指向之前,会先释放自己原来的内存
    

Ⅲ.shared_ptr    共享指针

  • 采用共享的拥有模式,可以允许多个shared_ptr指向相同内存

  • 当一个内存被shared_ptr指向时,内部有一个引用计数器+1

  • 当指向该内存的某个shared_ptr离开作用域或者改变指向或者通过reset()时,引用计数器会-1

  • 当该内存的引用计数器被减为0时,由最后一个离开的shared_ptr在结束前释放该内存

  • 相关成员函数

    函数名 功能
    get() 获取指向内存的地址编号
    use_count() 获取引用计数器的值
    unique() 判断指向的内存是否只有一个shared_ptr指向;0不独占,1独占
    reset() 放弃对内存的指向,计数-1
  • 全局函数

    函数名 功能
    va12 = move(val1) 移动val1的值和使用权给val2
    swap( ) 交换两个对象
  • shared_ptr的循环引用问题:
    当两个类(A B)中都有可以指向对方类型的shared_ptr智能指针成员变量(pB pA),并且在类外通过shared_ptr指向new出来的两个类对象(pa指向类A pb指向类B),并且让他们的成员变量pB pA 指向对方,此时构成循环引用,导致就算类对象pa pb销毁,但它们指向的对象的引用计数无法减为0(pA pB还在指向),导致无法释放对象内存,内存泄漏

Ⅳ.weak_ptr    弱引用指针

  • weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响该对象的生命周期,也即是说将一个weak_ptr指向一个shared_ptr对象,或者离开时都不会改变该对象的引用计数,只有当最后一个shared_ptr离开该对象才会销毁

  • weak_ptr更像是shared_ptr的一个助手,而不是独立的智能指针。因此当发生shared_ptr的循环引用产生死锁时,可以把其中一个类的shared_ptr成员变量改为weak_ptr,即可避免产生死锁

标签:p1,指向,C++,智能,内存,shared,ptr,指针
From: https://www.cnblogs.com/wangqiuji/p/17672826.html

相关文章

  • C++异常处理
    一、异常处理程序的错误大致分三种:语法错误、逻辑错误、运行时错误运行时错误发生在程序运行期间发生的问题:除零、内存分配失败、非法访问内存、文件不存在、数组越界C++的异常处理机制就是为了解决运行时错误C语言中运行时错误如果不管,系统会执行默认操作,可能会让程......
  • C++模板
    一、类型信息运算符typeid在C++中typeid可以获取数据的类型,但是需要加头文件typeinfofind/usr/include-nametypeinfotypeid是运算符,执行运算符函数,执行的返回类型是type_info类类型对象type_info中有个name的成员函数type_info中还重载了==运算符,可以直接比较......
  • 标准C++ -- day09
    一、智能指针常规指针的缺点:当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free、delete、delete[]语句忘记执行或者无法执行,形成内存泄漏如何定位内存泄漏、如何预防内存泄漏智能指针的优点:......
  • 探索C++非质变算法:如何更高效地处理数据
    前言......
  • 手撕数据结构与算法——树(三指针描述一棵树)
    ......
  • c++IO流——开工啦
    ......
  • Lnton 羚通智能分析算法拥挤聚集智能监测算法
      拥挤聚集智能监测算法可以通过yolov8网络模型深度学习框架对人员数量、密度等进行实时监测,拥挤聚集智能监算法识别出拥挤聚集的情况,并及时发出预警。YOLOv8的发展方向与当前主流的实时目标检测器不同,它能够同时支持移动GPU和从边缘到云端的GPU设备。除了架构优化之外,该......
  • 视频云存储/安防监控/AI视频智能分析网关V3:工服检测功能详解
    在一些工地、后厨、化工、电力等特定的场景中,工服的穿戴是必不可少的。这不仅是安全制度的要求,更能降低工作风险、提高工作效率。TSINGSEE青犀AI边缘计算网关硬件——智能分析网关可以通过实时监测和识别工人的工装穿戴情况,确保他们符合安全要求。只需在施工场地等监控区域内对......
  • Lnton 羚通智能分析算法智慧停车检测算法
    智慧停车算法是指利用各种传感器技术和数据分析方法,通过智能化的方式管理和优化停车场资源利用的算法。近年来,为了扩充停车位的数量,缓解停车压力,路边停车的方式开始逐步推广。对于路边车位的管理,基于视觉的方案与人工、咪表、地磁等方案相比,其成本更低且易于部署,具有较大的研究和推......
  • MTK联发科安卓核心板主板方案_智能硬件定制
    一、安卓主板安卓主板 是随着智能安卓系统在手机、平板电脑大流行之后应用在传统智能交互设备中嵌入主板的PCBA,采用ARM应用处理器平台运行google的android智能化操作系统,面向的是特定应用领域的高性能、重智能交互的解决方案控制板。相较于传统的单片机,安卓主板具有更高的性能、更......