注意std::shared_ptr的循环引用

news2024/11/18 19:27:58

指针智能是RAII的思想的具体体现。利用对象生命周期来管理资源。

在C++11中,引入shared_ptr、weak_ptr和unique_ptr。

share_ptr是一个能有效解决赋值和拷贝构造的引用技术。

std::shared_ptr通过引用计数的方式来管理对象的生命周期,但是如果两个对象互相持有对方的std::shared_ptr,就会产生循环引用,导致引用计数永远不会降到零,从而引发内存泄漏

循环引用产生

俩个对象互相持有对方的shared_ptr 导致计数永远不会降到零

下面看一个例子:

在这个例子中,定义了一个结构体Node,它的prev和next分别是shared_ptr类型

有俩个对象node1和node2,node1的next是node2,node2的prev是node1

俩者都持有对方的指针。

node1创建时count为1,被赋值给 node2的prev后,count为2.

同时node2的count初始为1,被赋值后为2;

通过智能指针托管node1和node2在对象生命周期结束后,应该由析构函数完成清理工作。

在进程结束后,并没有触发析构函数

分析

计数没有被释放到0

Node1对象创建后 Node2创建。

出了作用域先析构Node2结点。share_ptr的析构会自减引用计数,由2减到1,引用计数不为0,不发生其它操作;

析构Node1的结点析构,引用计数减到1,不发生其它操作;

之后Node1和Node2的引用计数都是1;

右边结点的空间什么时候销毁?左边结点的next销毁.

左边结点的next什么时候销毁?左边结点销毁

左边结点什么时候销毁?右边结点的prev销毁。

右边结点的prve什么时候销毁。右边结点的销毁。

经过几次往复后,右边结点也不会被销毁,存在循环引用的问题。

那么当循环引用出现后,即使进程结束,资源也不会被回收。

weak_ptr

解决循环引用的问题,就要针对俩个对象持有对方的shared_ptr特殊处理

std::weak_ptr是C++标准库中的一种智能指针,它设计用来解决std::shared_ptr之间循环引用的问题。

weak_ptr持有对一个由shared_ptr管理的对象的非拥有(弱)引用,这意味着weak_ptr不会增加对象的引用计数。

这样,即使存在循环引用,对象的生命周期仍然能够由shared_ptr正确管理,当最后一个shared_ptr被销毁时,相关联的资源会被释放。

weak_ptr就是辅助shared_ptr完成循环引用的问题。不会增加计数。

下面修改程序

将prev和next修改为weak_ptr<ListNode>弱引用计数不会被增加,所以在赋值后,计数是1。

weak_ptr的特点

  • 不是常规的智能指针,不支持RAII,是辅助share_ptr完成循环引用问题。
  • 支持像指针一样->和*
  • 即便weak_ptr指向的对象被销毁了,对weak_ptr的使用也是安全的,它不会悬挂指向无效内存。

总结

简而言之

weak_ptr就像一个观察者,不会对对象的生存产生影响,也不会因为对象的销毁而无效。

但是试图通过weak_ptr访问一个不存在的对象的操作会失败。

观察者可以识别到内存是否存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『番外篇三』Swift “乱弹”之带索引遍历异步序列(AsyncSequence)

概览 在 Swift 开发中,我们往往在遍历集合元素的同时希望获得元素对应的索引。在本课中,我们将向小伙伴们展示除 enumerated() 方法之外的几种实现思路。在玩转普通集合之后,我们将用“魔法棒”进一步搞定异步序列带索引遍历的实现。 在本篇博主中,您将学到以下内容: 概…

同时获取el-select的label和value

ui如下&#xff1a; 需求如下&#xff1a; 在点击确认的时候&#xff0c;将id和name都传给一个接口&#xff0c;但是ui只用展示name&#xff0c;name用v-model绑定给input框&#xff0c;但是id不知道怎么传给后端。 解决方法如下&#xff1a; vue中elementUi的el-select同时…

jmeter,csv文件参数化+断言 实现一个接口的case

1、case 及其 测试数据 注意保存文件的编码格式 id,name,limit,status,address,start_time,assert_status,assert_message 100,小米100,1000,1,某某会展中心101,2023-8-20 14:20,200,add event success ,,,,,,10021,parameter error 100,小米102,1002,1,某某会展中心103,2023-…

postman接口测试之Postman配置环境变量和全局变量

前言  我们在测试的过程中&#xff0c;遇到最多的问题也可以是环境的问题了吧&#xff0c;今天开发用了这个测试环境&#xff0c;明天又换了另一个测试环境&#xff0c;这样对于我们测试非常的麻烦&#xff0c;特别最接口的时候需要来回的输入环境地址比较麻烦&#xff0c;今天…

LVS负载均衡集群——NAT地址转换模式与DR直接路由模式

1. LVS集群基本介绍 Cluster&#xff0c;集群、群集。 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名或IP地址&#xff09;&#xff0c;相当于一台大型计算机。 2. 集群的类型 2.1 负载均衡群集&#xff08;Load Balanc…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后&#xff0c;后按照Tools->IP Generator顺序&#xff0c;创建IP核&#xff0c;如下图&#xff1a; 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图&#xff0c;生成的.v文件只…

外包干了4个月,测试技术退步明显

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入杭州某软件公司&#xff0c;干了3年的功能测试&#xff0c;当然有半年是被封在了家里&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我…

灾备建设中,虚拟机异构平台恢复技术原理与应用

在如今混合云环境下&#xff0c;实现异构虚拟化恢复与迁移面临着极大挑战。不同于市面上有代理的恢复方案&#xff0c;虚拟机无代理跨平台恢复解决方案利用自主研发的转换引擎&#xff08;VMCE&#xff09;对已备份虚拟机文件进行高效的存储格式转换和配置信息转换&#xff0c;…

Deep Graph Contrastive Representation Learning

摘要 如今&#xff0c;图表示学习已成为分析图结构数据的基础。受最近成功的对比方法的启发&#xff0c;在本文中&#xff0c;我们提出了一种新的无监督图表示学习框架&#xff0c;该框架利用节点级别的对比目标。具体来说&#xff0c;我们通过破坏生成两个图视图&#xff0c;…

Jmeter接口自动化测试操作流程(超详细整理)

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

基于人工智能算法与视频监控相结合的EasyCVR智能游乐园监控方案

随着圣诞节的到来&#xff0c;人们都已经在规划如何安排平安夜活动&#xff0c;游乐园俨然成为了人们的首选。游乐园人员流量大且密集&#xff0c;特别是在节假日和重大节日&#xff0c;人满为患&#xff0c;极易发生事故&#xff0c;为保证游乐场安全运营&#xff0c;减少事故…

JVM虚拟机系统性学习-JVM调优之GC日志分析

JVM 调优 首先&#xff0c;为什么要 JVM 调优呢&#xff1f; JVM 调优的目的就是为了让应用程序使用最小的硬件消耗来承载更大的吞吐量 什么情况下需要 JVM 调优呢&#xff1f; 系统吞吐量下降&#xff0c;或系统延迟较高出现 OOMFull GC 频繁GC 停顿时间过长&#xff08;超…

OneLLM:对齐所有模态的框架!

深度学习自然语言处理 原创作者&#xff1a;wkk 今天为大家介绍香港中文大学联合上海人工智能实验室的最新研究论文&#xff0c;关于在LLM时代将各种模态的信息对齐的框架。 论文&#xff1a;OneLLM: One Framework to Align All Modalities with Language地址&#xff1a;http…

vue中实现使用相框点击拍照,canvas进行前端图片合并下载

拍照和相框合成,下载图片dome 一、canvas介绍 Canvas是一个HTML5元素,它提供了一个用于在网页上绘制图形、图像和动画的2D渲染上下文。Canvas可以用于创建各种图形,如线条、矩形、圆形、文本等,并且可以通过JavaScript进行编程操作。 Canvas元素本身是一个矩形框,可以通…

《Kotlin核心编程》笔记:面向对象

kotlin 中的类 // Kotlin中的一个类 class Bird {val weight: Double 500.0val color: String "blue"val age: Int 1fun fly() { } // 全局可见 }把上述代码反编译成Java的版本&#xff0c;然后分析它们具体的差异&#xff1a; public final class Bird {privat…

逆向经历回顾总结

逆向经历回顾总结 一、前言 将自己的逆向经验做个总结&#xff0c;希望新手对逆向大方向能快速了解。高手有啥不一样的经验也可以讨论讨论。 二、个人经历 本人入行逆向全因一部韩剧“幽灵”&#xff0c;里面涉及渗透、病毒分析、取证的攻防对抗&#xff0c;我觉得对新手来说…

S1试讲讲稿

习题题目 答案 用到的概念&#xff1a; 概率之和等于1 E ( x ) ∑ i 1 4 x i P i E(x)\sum_{i1}^4x_iP_i E(x)∑i14​xi​Pi​ E ( x 2 ) ∑ i 1 4 x i 2 P i E(x^2)\sum_{i1}^4x_i^2P_i E(x2)∑i14​xi2​Pi​ V a r ( X ) Var(X) Var(X) ∑ i 1 4 ( x i − x ‾ ) 2…

美易官方:道指续创收盘历史新高

美国股市周三继续上涨&#xff0c;道琼斯工业平均指数连续六个交易日收高&#xff0c;并再次创下收盘历史新高。尽管市场对全球经济增长放缓的担忧依然存在&#xff0c;但美国经济数据的强劲表现以及企业盈利的良好预期&#xff0c;使得投资者对股市的信心得到提振。 在今日的交…

Volatility3内存取证工具安装及入门在Linux下的安装教程

1-1. Volatility3简介 Volatility 是一个完全开源的工具&#xff0c;用于从内存 (RAM) 样本中提取数字工件。支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多类型操作系统系统的内存取证。 针对竞赛这块&#xff08;CTF、技能大赛等&#xff09;基本上都…

系列二十七、Apache Jmeter使用

一、安装 下载安装包>解压到指定目录>双击打开D:\Programs\apache-jmeter-5.5\bin\ApacheJmeter.jar即可。我分享的ApacheJmeter链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1VI7f3buIWZbQEeq2CRbwlg?pwdyyds 提取码&#xff1a;yyds 二、使用 2.1、添…