首页 > 其他分享 >智能指针

智能指针

时间:2023-08-31 20:11:14浏览次数:32  
标签:p1 指向 智能 内存 shared ptr 指针

常规指针的缺点:         当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free/delete/delete[] 语句忘记执行或者无法执行,形成内存泄漏     智能指针的优点:         智能指针是一个封装了常规指针的类类型对象,并且重载了 * 和 -> 间接访问运算符,使用起来与常规指针相近         当智能指针离开作用域时,它的析构函数必定执行,从而在析构函数中执行释放常规指针的操作,这样就做到了自动释放的效果,从而避免内存泄漏         智能指针是一个类模版         C++STL中提供了四种智能指针:     auto_ptr/shared_ptr/unique_ptr/weak_ptr,在C++98标准中只有第一个auto_ptr,C++11只支持后三个,第一个被弃用,使用会产生警告     需要提供头文件 <memory>
    1、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);             2、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_qtr对象的内存
        可以通过C++的全局函数 move() 来转移内存的指向给另一个unique_ptr         p2 = move(p1);  //  让p2指向p1原来的内存,p1一定会变成空指针,p2在改变指向之前,会先释放自己原来的内存
    3、shared_ptr   共享指针         采用共享的拥有模式,可以允许多个shared_ptr指向相同内存         当一个内存被shared_ptr指向时,内部有一个引用计数器+1         当指向该内存的某个shared_ptr离开作用域或者改变指向或者通过reset()时,引用计数器会-1         当该内存的引用计数器被减为0时,由最后一个离开的shared_ptr在结束前释放该内存         相关的成员函数:             get()     获取指向内存的地址编号             use_count()   获取引用计数器的值             unique()      判断指向的内存是否只有一个shared_ptr指向             reset()     放弃对内存的指向,计数-1         全局函数:             val2 = 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还在指向),导致无法释放对象内存,内存泄漏             4、weak_ptr 弱引用指针         weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响该对象的生命周期,也就是说将一个weak_ptr指向一个shared_ptr对象,或者离开时都不会改变该对象的引用计数,只有当最后一个shared_ptr离开该对象才会销毁         weak_ptr 更像是shared_ptr的一个助手,而不是独立的智能指针         因此当发生sheared_ptr的循环引用产生死锁时,可以把其中一个类的shared_ptr成员变量改为weak_ptr,即可避免产生死锁

标签:p1,指向,智能,内存,shared,ptr,指针
From: https://www.cnblogs.com/ycddqr/p/17670334.html

相关文章

  • 基于AI智能分析网关EasyCVR视频汇聚平台关于能源行业一体化监控平台可实施应用方案
    随着数字经济时代的到来,实体经济和数字技术深度融合已成为经济发展的主流思路。传统能源行业在运营管理方面也迎来了新的考验和机遇。许多大型能源企业已开始抓住机遇,逐步将视频监控、云计算、大数据和人工智能技术广泛应用于生产、维护、运输、配送等环节,实现数据采集、业务监控......
  • Day12_文件的高级操作:控制文件指针移动
    1.文件高级操作:控制文件指针移动_12.模式0(参照物是文件开头位置)的示范: 3.模式1(参照物是当前指针所在位置)的示范:18.模式2(参照物是文件末尾位置,应该倒着移动)的示范: ......
  • 智能远程监考方案下的线上等级考试变革
    用指尖,「敲」下一段天马行空的想象。 7月底,2023青少年人工智能编程水平测试(YCL)如期开展,10万+考生完成线上应考。 作为“青少年信息技术培养工程”的重点项目之一,青少年人工智能编程水平测试,由工业和信息化部教育与考试中心、中国电子教育学会、中国工信出版传媒集团——北......
  • 动态数组指针应用
    TypeTMyArr=arrayofarrayofarrayofInteger;Pint=^TMyArr;varPArr:Pint;i,j,k,ic,jc,kc:Integer;beginic:=2;jc:=3;kc:=4;New(PArr);SetLength(PArr^,ic,jc,kc);fori:=0toic-1doforj:=0tojc-1......
  • 数组类型指针
    {使用一个元素的数组指针}PMyRec=^TMyRec;TMyRec=recordF1:Char;F2:Word;end;procedureTForm1.Button1Click(Sender:TObject);typePArr=^TArr;TArr=array[0..0]ofTMyRec;varbuf:PArr;i:Integer;beginGetMem(buf,SizeOf......
  • 数组指针参数
    Constarr1:array[0..1,0..1]ofstring=(('A0B0','A1B0'),('A0B1','A1B1'));arr2:array[0..2,0..1]ofstring=(('X0Y0','X1Y0'),('X2Y0','X0Y1'),......
  • 新增!视频智能分析/AI算法智能分析网关V5告警功能添加教程来咯!
    智能分析网关系列是基于边缘AI计算技术,可对前端摄像头采集的视频流进行实时检测分析,能对监控画面中的人、车、物进行识别,可实现的检测包括:人脸检测与识别、车辆检测与识别、烟火识别、安全帽/反光衣识别、区域入侵识别等,支持对检测到的异常进行实时告警、抓拍、推送。近期,智能分析......
  • 【校招VIP】前端算法考点之快慢指针题型
    考点介绍:链表是校招面试里手撕代码出现频度比较高的题型,三线和中小厂会考察简单的链表反转,大厂会进一步考察复杂度和双指针问题,比如中间元素、是否存在环等。一、考点题目1.一个长度为n的单向链表,用O(1)空间复杂度来实现倒转输出,使用最低时间复杂度解答:单向链表,直接设结点No......
  • 前馈神经网络解密:深入理解人工智能的基石
    本文深入探讨了前馈神经网络(FNN)的核心原理、结构、训练方法和先进变体。通过Python和PyTorch的实战演示,揭示了FNN的多样化应用。作者TechLead,拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业......
  • 智能界面组件DevExpress BI Dashboard — 新的导出功能(v23.1)
    在DevExpressv23.1发布周期中,官方扩展了DevExpressBIDashboard项的导出功能,这些增强功能适用于WinForms、WPF和Web平台,包括以下选项:将自定义Dashboard项导出到Excel并自定义导出的文档本身在导出期间自定义PivotGridDashboard项DevExpressv23.1正式版下载DevExpress技......