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

智能指针初探

时间:2023-07-20 19:00:17浏览次数:30  
标签:weak 智能 引用 初探 shared unique ptr 指针

智能指针是C++11引入的,比裸指针更为强大的指针。主要作用是用来完成一定程度上的内存资源管理自动化。

unique_ptr

unique_ptr实现专属所有权功能。unique_ptr不允许拷贝,只允许移动,保证了没有其他的指针指向unique_ptr指向的对象。unique_ptr被析构时,其析构函数会主动析构所指向的对象。

默认unique_ptr使用delete析构对象,不过它也支持自定义析构器。添加自定义析构器可能会增加unique_ptr的大小,在默认状态下,unique_ptr和裸指针的性能和大小是一张的。

同时unique_ptr可以支持转换成shared_ptr,所以在不知道用什么智能指针的情况下,直接用unique_ptr就完事了。

可以使用make_unique来创建一个unique_ptr

shared_ptr

shared_ptr实现共享所有权功能,内部维护了一个引用计数,只有当引用计数为0时,该shared_ptr被析构才会调用内部指向对象的析构函数。

shared_ptr的复制,会使得其引用计数+1,对其的析构会使得引用计数-1,而对其进行移动,则不会修改引用计数。
shared_ptr同样默认使用delete进行析构,也支持自定义析构器,但是与unique_ptr不同,对其进行自定义析构器不会改变shared_ptr的大小。

image
shared_ptr本身的尺寸是普通指针的两倍,因为其内部实际上维护了两个指针。第二个指针会指向一个叫做控制块的数据结构,里面维护了许多信息。

  • shared_ptr第一次被make出来时,它会创建一个控制块。
  • shared_ptrunique_ptr转化过来时,也会创建一个控制块。
  • shared_ptr从一个裸指针转化过来时,也会创建一个控制块。

其中,从裸指针转换成shared_ptr是最危险的,因为你可以转换任意多次,这会导致拥有对同一个对象的若干个控制块,而每一个控制块的引用计数归0时都会引发一次析构,也就是会导致多重析构的结构。所以实践中尽量避免。

weak_ptr

weak_ptr属于是shared_ptr的补丁。这么说是因为,shared_ptr有一个无法绕过的槛,循环引用。假设你有两个shared_ptr,分别是A和B。令A指向B,令B指向A,那么此时双方的引用计数永远都是1,也就是永远都不会析构,已经达成了事实上的内存泄漏。

但是这种相互引用的需求本身是真实存在的,就比如说图数据结构,一个节点可以被其他节点引用,同样也会引用很多其他的节点。所以在这种情况下,shared_ptr行不通,那就要使用weak_ptr
weak_ptr不会影响shared_ptr的引用计数,可以从shared_ptr中创建一个weak_ptr出来。而weak_ptr就具有检测这个shared_ptr是否为空的功能,并且可以根据需要,返回这个shared_ptr,使得你可以访问weak_ptr所指向的对象。

标签:weak,智能,引用,初探,shared,unique,ptr,指针
From: https://www.cnblogs.com/st0rmKR/p/17569394.html

相关文章

  • 计讯物联5G千兆网关TG463赋能无人船应用方案,开启自动巡检的智能模式
    方案背景水电站、水库、堤坝等水利工程水下构筑物常年处于水下,并在复杂的水流环境下运行,难免会出现磨蚀、露筋等损伤,而传统的安全监测方式一般是通过潜水员检查上层水柱或通过降低水位进行人工巡查,不仅成本高,效率低,对防洪安全和电力生产造成极大负面影响,而且会给安全监测员带来生......
  • 智能制造之路—从0开始打造一套轻量级MOM平台
    一、概述面对数字化浪潮,MOM需求迈入上升期,数字化从“可选项”变成了企业竞争“必选项”。制造行业每个工厂的生产逻辑都不尽相同,流程的梳理、数据统一化都需要调配很长时间。对于制造企业来说一套快速构建业务的平台,看起来是解决制造行业“每个工厂生产逻辑不同”问题的良方。......
  • 行行AI人才直播第11期:墨尔本大学数据科学高级讲师-宫明明《机器学习:从统计到因果,人工
    行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台。马克斯·普朗克智能系统中心主任曾在国际数学家大会进行了题为FromStatisticaltoCausalLearning的报告,建立和理解人工智能系统的基本研究思路:从通过统计学习的符号方法到依靠因果关系概念的干预模......
  • 关于this指针你知道多少?
    JavaScript中的this指针是一个非常重要且常见的概念。理解this指针的原理、优缺点和应用场景对于编写高效且健壮的JavaScript代码至关重要。本文将深入探讨this指针的相关内容。一、this指针的原理在JavaScript中,this是一个特殊的关键字,它在函数内部使用,用于指向调用该函数的对......
  • Baklib对比魔音智能有何特别优势?
    Baklib和魔音智能都是具有一定特色和优势的产品。Baklib在线知识库制作、高效的编辑功能、集中的在线存储、展示能力。解决了个人与企业在工作过程中文档管理混乱、知识孤立等问题;降低成本的同时、全面提升个人与团队工作效率、高效的管理使办公更轻松。 在比较两者时,Baklib相比......
  • PPT|基于工业互联网智能工厂总体建设方案-服装类P39
    ......
  • 集群监管-USDP(智能大数据平台)
    UCloudSmartDataPlatform(简称USDP),是UCloud推出的智能化、轻量级、适用于私有化部署至客户本地的大数据基础服务平台,通过自研的USDPManager管理工具,支持用户创建大数据集群,在集群中部署Hadoop、Hive、HBase、Spark、Flink、Presto、Atlas、Ranger等众多开源大数据组件,并......
  • 逛画展(双指针)
    #逛画展##题目描述博览馆正在展出由世上最佳的$m$位画家所画的图画。游客在购买门票时必须说明两个数字,$a$和$b$,代表他要看展览中的第$a$幅至第$b$幅画(包含$a,b$)之间的所有图画,而门票的价钱就是一张图画一元。Sept希望入场后可以看到所有名师的图画。当然,他想最小......
  • 软件研发过程中不可或缺的智能研发管理平台
    远光天骏智能研发管理平台能为企业提供需求管理,需求分析,用例设计,故事迭代,测试计划,编译部署,质量管控,精益度量的一站式协同研发服务,帮助企业规范化研发过程,大幅提升研发效率和质量,持续提高企业IT运营能力。 从“软件工程”这一名称诞生以来,“质量”和“效率”就是它的目标。为......
  • 电源供电防干扰低功耗6键/6通道触摸触控IC-VK3606D SOP16适用于温控器,86面板触摸开关,
    概述 VK3606D具有6个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了6路1对1直接输出低电平有效。最长输出时间10S。芯片内部采用特殊的集成电路,具有高电源电压抑制比,可减少按键检测错误的发生,此特......