当前位置: 首页 > news >正文

C++智能指针weak_ptr的作用

当使用std::shared_ptr时,循环引用可能会导致资源泄漏的问题。下面是一个简单的示例,展示了循环引用导致资源泄漏的情况:

#include <iostream>
#include <memory>class A;
class B;class A {
public:std::shared_ptr<B> b_ptr_;A() {std::cout << "A constructor" << std::endl;}~A() {std::cout << "A destructor" << std::endl;}
};class B {
public:std::shared_ptr<A> a_ptr_;B() {std::cout << "B constructor" << std::endl;}~B() {std::cout << "B destructor" << std::endl;}
};int main() {std::shared_ptr<A> a_ptr(new A());std::shared_ptr<B> b_ptr(new B());a_ptr->b_ptr_ = b_ptr;  // A持有B的shared_ptrb_ptr->a_ptr_ = a_ptr;  // B持有A的shared_ptrreturn 0;
}

在上述示例中,类A和类B相互持有对方的std::shared_ptr。这样就形成了循环引用,因为两个对象彼此引用对方的std::shared_ptr,导致引用计数永远不会变为0,资源无法正确释放。

main()函数结束时,a_ptrb_ptr超出了作用域,它们的析构函数被调用,但由于循环引用的存在,对象AB的析构函数不会被调用,资源无法被释放,从而导致资源泄漏。

为了避免循环引用导致的资源泄漏,可以使用std::weak_ptr来打破循环引用,如下所示:

#include <iostream>
#include <memory>class A;
class B;class A {
public:std::shared_ptr<B> b_ptr_;A() {std::cout << "A constructor" << std::endl;}~A() {std::cout << "A destructor" << std::endl;}
};class B {
public:std::weak_ptr<A> a_ptr_;B() {std::cout << "B constructor" << std::endl;}~B() {std::cout << "B destructor" << std::endl;}
};int main() {std::shared_ptr<A> a_ptr(new A());std::shared_ptr<B> b_ptr(new B());a_ptr->b_ptr_ = b_ptr;  // A持有B的shared_ptrb_ptr->a_ptr_ = a_ptr;  // B持有A的weak_ptrreturn 0;
}

在上述示例中,类B的成员变量a_ptr_使用std::weak_ptr来持有A的弱引用,这样不会增加A对象的引用计数。当A对象被释放时,std::weak_ptr会自动失效,不会影响资源的释放。这样就打破了循环引用,避免了资源泄漏的问题。

相关文章:

C++智能指针weak_ptr的作用

当使用std::shared_ptr时&#xff0c;循环引用可能会导致资源泄漏的问题。下面是一个简单的示例&#xff0c;展示了循环引用导致资源泄漏的情况&#xff1a; #include <iostream> #include <memory>class A; class B;class A { public:std::shared_ptr<B> b…...

lintcode 344 · 歌曲时间【背包问题,动态规划】

题目链接&#xff0c;描述 https://www.lintcode.com/problem/344/ 给定长度为N的正整数数组song代表N首歌的时间 请你任选其中若干首播放&#xff0c;在满足开始播放最后一首歌的时间小于M的情况下求播放歌曲的最长时间 每首歌只能被播放一次 你可以任意指定播放顺序1 \leq …...

Qt应用开发(基础篇)——对话框窗口 QDialog

一、前言 QDialog类继承于QWidget&#xff0c;是Qt基于对话框窗口(消息窗口QMessageBox、颜色选择窗口QColorDialog、文件选择窗口QFileDialog等)的基类。 QDialog窗口是顶级的窗口&#xff0c;一般情况下&#xff0c;用来当做用户短期任务(确认、输入、选择)或者和用户交流(提…...

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 三、总结 一、理论 1.CA认证中心 &#xff08;1&#xff09;概念 CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户…...

C++图形界面编程-MFC

C控制台程序是命令行黑框&#xff0c;如果要写一个图形界面&#xff0c;VS也提供了图形界面编程MFC。建项目的时候选如下选项&#xff1a; 类似于QT。 问&#xff1a;那么MFC项目的运行入口main()或WinMain()在哪里呢&#xff1f; 答&#xff1a;其实&#xff0c;在MFC应用程…...

知识扩展贴 圆越大,其圆接触的无知面就越多

CSDN 排行榜 https://blog.csdn.net/rank/list/total?spm1001.2014.3001.5476 顺其自然~_-CSDN博客...

怎么把pdf转换成jpg格式?

怎么把pdf转换成jpg格式&#xff1f;在我们日常的办公过程中&#xff0c;PDF文件是一个经常被使用来传输文件的格式。它能够确保我们的文件内容不会混乱&#xff0c;并以更加完美的方式呈现出来。然而&#xff0c;PDF文件也存在一些缺陷。例如&#xff0c;它无法直接编辑&#…...

Android SDK 上手指南||第六章 用户交互

第六章 用户交互 在这篇教程中&#xff0c;我们将对之前所添加的Button元素进行设置以实现对用户点击的检测与响应。为了达成这一目标&#xff0c;我们需要在应用程序的主 Activity类中略微涉及Java编程内容。如果大家在Java开发方面的经验不太丰富也没必要担心&#xff0c;只…...

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游&#xff0c;带回来很多小商品&#xff0c;就是一整个物美价廉&#xff0c;但是为什么线下购物和网购有的时候差别这么大&#xff08;网购经常要退换货啊&#x1f62d;&#x1f62d;&#x1f62d;&#xff09;&#xff0c;为此我萌生了一个想法&…...

【大模型AIGC系列课程 2-3】动手为ChatGPT打造第二大脑

文本向量的应用 one-hot 文本向量 !pip install jiebaimport jieba # 中文分词包text = 6月27日,世界经济论坛发布了《2023年10大新兴技术》报告。重点介绍了在未来3—5年对全球经济、工作、生活、医疗等产生积极影响的创新技术。其中,生成式AI首次入选并排名第2位。世界经…...

【ARM AMBA AXI 入门 10 - AXI 总线 DATA信号与 STRB 信号之间的关系 】

文章目录 AXI STRB 信号 AXI STRB 信号 AXI总线是ARM公司设计的高性能处理器接口&#xff0c;其中STRB和DATA信号在AXI协议中有特殊的含义和关系。 DATA信号&#xff1a;在AXI中&#xff0c;DATA信号用于在读写操作中传输实际的数据。数据的大小可以根据AXI接口的位宽来变化&…...

软引用的使用场景-链路日志

我司自研的链路系统中的agent层记录日志时&#xff0c;使用的是异步打印日志的机制。异步打印会使用队列&#xff0c;现将待打印的日志对象&#xff0c;记录在队列中。 但这块的日志&#xff0c;为了不影响业务&#xff0c;例如不能因为链路记录的日志过多&#xff0c;导致业务…...

【java】【项目实战】[外卖七]手机短信开发

目录 一、发送短信 1 短信服务介绍 2 阿里云短信服务&#xff08;个人现在不太好申请了&#xff09; 2.1 介绍 2.2 注册账号 2.3 设置短信签名 2.4 设置短信模版 2.5 设置AccessKey 3 代码开发 3.1 导包 3.2 短信发送工具类SMSUtils 二、手机验证码登录 1 需求分析 …...

Web 开发 Django 模板

上次为大家介绍了 Django 的模型和自带的管理工具&#xff0c;有了这个工具就可以全自动地根据模型创建后台管理界面&#xff0c;以供网站管理者更方便的管理网站数据。有了网站数据&#xff0c;那怎么样更方便又好看的展示给用户看呢&#xff1f;目前流行的 Web 框架基本都采用…...

动态可编辑表单项

遇到的问题&#xff1a;业务需要用户输入对应的username以发送私信给指定对象 方案1-input 输入就完事了 缺陷&#xff1a;要输入&#xff0c;麻烦 <form><label for"recipient-name">发给&#xff1a;</label><input type"text"…...

【Docker入门第一篇】

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使…...

数据集收集列表(opencv,机器学习,深度学习)持续更新

opencv 车牌识别数据集 opencv 手写数字识别数据集 机器学习 印第安糖尿病 Pima Indians数据集 &#xff0c;下载地址 Boston波士顿房价数据集 &#xff0c;下载...

springboot整合rabbitmq发布确认高级

在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们如何才能进行 RabbitMQ 的消息可靠投递。 发布确认 发布确认方案 架构 配置…...

【linux命令讲解大全】010. mapfile命令和tempfile命令的用法及示例

文章目录 mapfile概要主要用途选项参数返回值例子 tempfile补充说明tempfile 命令$$ 变量 从零学 python mapfile 从标准输入读取行并赋值到数组。 概要 mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] 主要用途 …...

在 Python 中构建卷积神经网络; 从 0 到 9 的手绘数字的灰度图像预测数字

一、说明 为了预测从0到9的数字&#xff0c;我选择了一个基于著名的Kaggle的MNIST数据集的数据集。数据集包含从 <0> 到 <9> 的手绘图数字的灰度图像。在本文中&#xff0c;我将根据像素数据&#xff08;即数值数据&#xff09;和卷积神经网络预测数字。 二、 卷积…...

前端分页处理

页面中实现的分页效果&#xff0c;要么后端提供接口&#xff0c;每次点击下一页就调用接口&#xff0c;若不提供接口&#xff0c;分页得前端自己去截取。 方法一&#xff1a;slice方法 slice(参数1&#xff0c;参数2)方法是返回一个新的数组对象&#xff0c;左开右闭 参数1&…...

【C语言】位操作符的一些题目与技巧

初学者在学完位操作符之后&#xff0c;总是不能很好的掌握&#xff0c;因此这篇文章旨在巩固对位操作符的理解与使用。 有的题目可能会比较难以接受&#xff0c;但是看完一定会有收获 目录 位操作符&#xff1a;一些题目&#xff1a;不创建临时变量交换整数整数转换二进制中1的…...

爬虫逆向实战(二十二)--某恩数据电影票房

一、数据接口分析 主页地址&#xff1a;某恩数据 1、抓包 通过抓包可以发现数据接口是API/GetData.ashx 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;响应是…...

火山引擎发布自研视频编解码芯片

2023年8月22日&#xff0c;火山引擎视频云宣布其自研的视频编解码芯片已成功出片。经验证&#xff0c;该芯片的视频压缩效率相比行业主流硬件编码器可提升30%以上&#xff0c;未来将服务于抖音、西瓜视频等视频业务&#xff0c;并将通过火山引擎视频云开放给企业客户。 火山引…...

投递技术类简历的注意事项

简历修改的背景 作为程序员&#xff0c;随着工作年限的增加&#xff0c;要定期的去修改自己的简历中的工作项目&#xff0c;一方面可以促进自己复盘一下工作成果和个人成长&#xff0c;另外也能给自己换工作提供一个前置的便捷性。 注意事项 修改简历的时候有哪些需要注意的…...

每日一题——柱状图中最大的矩形

柱状图中最大的矩形 题目链接 用什么数据结构&#xff1f; 要得到柱状图中最大的矩形&#xff0c;我们就必须要知道对于每一个高度heights[i]&#xff0c;他所能勾勒出的矩形最大是多少&#xff08;即宽度最大是多少&#xff09;。 而对应到图上我们可以知道&#xff0c;要知…...

Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台

Banana Pi推出基于龙芯2K1000LA处理器的信创工业控制开发平台&#xff1a;BPI-5202信创工业控制开发平台 BPI-5202 龙芯2K1000LA 信创工业控制开发平台 1.1 工控机的应用场景 物联网的狂潮&#xff0c;既是一场众多的计算机软硬件厂家&#xff08;也包括通讯方案和产品厂家&…...

springCloud整合Zookeeper的时候调用找不到服务

SpringCloud整合Zookeeper的时候调用找不到服务 首先&#xff0c;我们在注册中心注册了这个服务&#xff1a; 然后我们使用RestTemplate 调用的时候发现失败了&#xff1a;找不到这个服务&#xff1a; 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…...

【kubernetes】使用kubepshere部署中间件服务

KubeSphere部署中间件服务 入门使用KubeSphere部署单机版MySQL、Redis、RabbitMQ 记录一下搭建过程 (内容学习于尚硅谷云原生课程) 环境准备 VMware虚拟机k8s集群&#xff0c;一主两从&#xff0c;master也作为工作节点&#xff1b;KubeSphere k8skubesphere devops比较占用磁…...

如何从tabbar页面传数据

无论是百度小程序还是微信小程序&#xff0c;app.json中规定的tabbar页面是不支持传参的&#xff0c;例如&#xff1a; <navigator url../service/service?typeid6 openType"switchTab"> 服务项目 </navigator> 上面的navigater跳转有个属性&#…...

用闲置的安卓手机做网站/爱用建站

xcopy 文件夹name %date:~0,4%%date:~5,2%%date:~8,2% /D:05-23-2017 /S /R /Y PAUSE 日期和文件夹名字修改好&#xff0c; 放在当前文件夹下&#xff0c;按D转载于:https://www.cnblogs.com/beimingbingpo/p/6892803.html...

一个企业做网站推广的优势/百度导航官网

1.新建Gui工程&#xff0c;在主界面上添加一个标签label&#xff0c;并设置其显示内容为“0000-00-00 00:00:00 星期日”。2.在mainwindow.h中添加槽函数声明。private slots:void timerUpDate();3.在mainwindow.cpp中添加代码。添加#include 的头文件包含&#xff0c;这样就包…...

分销系统什么意思/安徽seo网络优化师

简单的C语言编辑器课程设计《编译原理》课程设计简单的C语言编译器6 -扬 州 大 学编译原理课程设计报告题 目题 目 简单的编译器班 级 计科0802班学 号 081202427姓 名 张 俊指导教师 姜 卯 生成 绩扬州大学信息工程学院2011课程设计题目实现一个简单的编译器课程设计目的通过编…...

网站建设的利润率多少/媒体发稿网

布局实际上是一个Slot模型&#xff0c;其中每个父对象分配给子对象一个Slot&#xff0c;子对象可以自由占用Slot中的空间&#xff0c;通过Margin\VerticalAlignment\HorizontalAlignment控制 实例 <Border Background"LightBlue" BorderBrush"Black" Bo…...

wordpress改字号/房地产市场现状分析

---恢复内容开始--- JS 1、JS介绍 ○ JS全称是JavaScript,但不是java,它是一门前台语言,而Java是后台语言。 ○ 前台语言&#xff1a;运行在客户端的 后台语言&#xff1a;和数据库有关的 ○ JS作者是布兰登艾奇。 2、用途 ○ 页面特效 ○ 开发页面游戏 ○ 后台开发 ○ ...... …...

app网站公司名称/哔哩哔哩b站在线看免费

前言Excel是很多公司非常流行的工具&#xff0c;数据分析师和数据科学家经常发现他们把它作为数据分析和可视化工具的一部分&#xff0c;但这并不总是最好的选择。尤其是在数据量很大的时候&#xff0c;Excel容易让我们无法使用其他应用程序&#xff0c;而且有些报告需要30分钟…...