注意std::shared_ptr的循环引用

指针智能是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访问一个不存在的对象的操作会失败。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

老卫带你学---leetcode刷题(29. 两数相除)

29. 两数相除 问题 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &…

动态面板简介以及ERP原型图案列

动态面板简介以及ERP原型图案列 1.Axure动态面板简介2.使用Axure制作ERP登录界面3.使用Asure完成左侧菜单栏4.使用Axuer完成公告栏5.使用Axuer完成左边侧边栏 1.Axure动态面板简介 在Axure RP中&#xff0c;动态面板是一种强大的交互设计工具&#xff0c;它允许你创建可交互的…

致远互联FE协作办公平台 editflow_manager.jsp 存在SQL注入漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 致远互联FE协作办公平台是一个专注于协同管理软件领域的数智化运营平台及云服务提供商。平台旨在为企业提供数字化转型和升级的解决方案&#xff0c;特别是针对大中型政府和企业客户。平台的主要特点包括开放共享…

Linux环境下HTTP请求的代码详解与实例

嘿&#xff0c;Linux狂热者们&#xff0c;是时候让我们在这个充满激情的平台上探索一下HTTP协议的奥秘了。我知道&#xff0c;对于这个我们每天都在使用&#xff0c;但却可能没深入了解过的HTTP&#xff0c;你们一定充满了好奇和期待。那么&#xff0c;让我们一起踏上这趟探索之…

LeetCode977有序数组的平方两种方法实现(java实现)

今天来分享的是LeetCode977有序数组的平方的实现方法&#xff0c;我们先来看下题目&#xff1a; 提示&#xff1a;我们在读题的时候一定要仔细&#xff0c;注意题目给定的条件是有序数组。 方法1&#xff1a;我们在看到题目的第一时间是无非是将数组每个元素进行平方&#xff…

高德地图+Vue中使用出现的问题

最近在做高德地图的逆向地理编码API出现了问题 按着官方的方式写代码运行时出现了问题&#xff0c;随后问了技术人员。 添加之后成功运行

云原生之深入解析Kubernetes中服务的性能

一、Pyroscope 简介 ① 什么是 Pyroscope&#xff1f; 开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因&#xff0c;为此通常需要可以通过日志和代码工具收集的信息。不幸的是&#xff0c;这种方法通常很耗时&#xff0c;并且不能提供有关潜在问题的足够详细信…

关于APP出海营销,有哪些开发者成功出圈?

NetMarvel 投身于开发者出海用户增长/广告变现业务已将近9个年头&#xff0c;帮助国内外众多开发者解决全球移动营销难题&#xff0c;最大化收益&#xff0c;实现全球范围内的极速增长。 NetMarvel有效助力Piggy Go、VNG、Candy Crack等游戏应用&#xff0c; Shopee、Tango等非…

四六级高频词组13

目录 词组 其他链接&#xff1a; 词组 551. beyond &#xff08;all&#xff09; question &#xff08;without question&#xff09; 毫无疑问 552. out of the question &#xff08;impossible&#xff09; 不可能的 553. in question &#xff08;under discussion&…

Etsy运营秘籍——打造大卖店铺的九大技巧

在跨境电商的浩瀚海洋中&#xff0c;Etsy 作为一个注重手工制作与独特设计的平台&#xff0c;吸引了众多卖家的关注。在 Etsy 的世界里&#xff0c;成功运营小店需要更多的智慧和技巧。作为一位在 Etsy 上开店多年的老手&#xff0c;在这过程中也总结了不少经验&#xff0c;这篇…

案例066:基于微信小程序的家政预约设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

第P7周:咖啡豆识别(VGG-16复现)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、前期工作 import …

【ET8框架入门】1.运行指南

主要学习网址 论坛地址为&#xff1a;https://et-framework.cn Git地址为&#xff1a;GitHub - egametang/ET: Unity3D Client And C# Server Framework 官方QQ群 : 474643097 多线程多进程框架设计-01预告_哔哩哔哩_bilibili 项目检出 检出项目切换到release8.0分支 Git…

网络安全——基于Snort的入侵检测实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、掌握…

visdom使用小技巧

visdom常用于深度学习迭代过程的可视化。在代码中&#xff0c;需要在相应位置增加如下代码&#xff1a; import visdomvis visdom.Visdom(envudomain_accuracy) #设置的环境名称vis.line(Xnp.array([epoch]), Ynp.array([domain_accuracy]),windomain_accuracy,updateappend,…

持续集成交付CICD:Jenkins使用基于SaltStack的CD流水线部署前后端应用

目录 一、实验 1.Jenkins使用基于SaltStack的CD流水线部署后端应用 2.Jenkins使用基于SaltStack的CD流水线部署前端应用 一、实验 1.Jenkins使用基于SaltStack的CD流水线部署后端应用 &#xff08;1&#xff09;GitLab添加Token (2)Jenkins添加凭据 &#xff08;3&#xf…

Modbus转Profinet网关配置步骤

Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关&#xff08;XD-MDPN100/200&#xff09;无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

重新思考U-Net在医学超声图像分割中的应用(NU-net)

Rethinking the Unpretentious U-net for Medical Ultrasound Image Segmentation 摘要&#xff1a; 乳腺肿瘤分割是帮助我们描述和定位肿瘤区域的关键步骤之一。然而&#xff0c;乳腺肿瘤形态多变、边界模糊、强度分布相似&#xff0c;给乳腺肿瘤的准确分割带来了挑战。近年…

matter模组有无源测试事例

测试一款matter模组的硬件性能 1.1 天线阻抗、电压驻波比测试 主要测试&#xff1a;PCB板载天线设计效率及板材PCB铜面的平整度等 1.2 模组有源数据测试 主要测试&#xff1a;模组的阻抗匹配、频偏等情况 1.3 模组传输能量精度 主要测试&#xff1a;矢量误差等数据 1.4 模…

多家高校设立“鸿蒙班”;ChatGPT 成为 Nature 年度十大人物丨 RTE 开发者日报 Vol.107

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…