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

【C++进阶】智能指针

文章目录

  • 为什么需要智能指针?
  • 内存泄漏
    • 什么是内存泄漏,内存泄漏的危害
    • 内存泄漏分类(了解)
    • 如何避免内存泄漏
  • 智能指针的使用及原理
    • smart_ptr
    • auto_ptr
    • unique_ptr
    • shared_ptr
      • 线程安全的解决
      • 循环引用
    • weak_ptr
  • 删除器

为什么需要智能指针?

我们先来看一段代码:
在这里插入图片描述

大家觉得这段代码有什么问题?
发生了,内存泄漏。
在这里插入图片描述

因为p1,p2,p3指向的空间没有释放掉导致的。这就是异常安全问题。那要怎么解决呢?我们下面再回答。

内存泄漏

什么是内存泄漏,内存泄漏的危害

在这里插入图片描述
在这里插入图片描述

内存泄漏分类(了解)

  • 堆内存泄漏(Heap leak)
    堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak
  • 系统资源泄漏
    程序使用系统分配的资源比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定

如何避免内存泄漏

在这里插入图片描述

智能指针的使用及原理

在这里插入图片描述

smart_ptr

在这里插入图片描述
那么smart_ptr能解决上面遗留的问题吗?答案是可以的。
在这里插入图片描述
在这里插入图片描述
那么这个smart_ptr还有一些什么问题呢?
在这里插入图片描述

没错就是拷贝构造或者拷贝赋值的时候就会出问题,因为析构的时候同一块空间会被析构两次,这时候就会报错。那么该怎么解决呢?

auto_ptr

这时候就有人提出了管理权转移的思想来解决这个问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大家可以看到auto_ptr很好的解决了上面的问题,但是auto_ptr自身有一个很大的问题大家知道吗?就是悬空问题。
在这里插入图片描述
从上图可以看出p1变成悬空指针,且程序无法正常运行。
从中可以看出auto_ptr是一个失败的设计,并且很多公司都禁止使用auto_ptr.

unique_ptr

经过上面的尝试发现不行后,有人就想出了一个简单粗暴的办法,我直接防拷贝不就好了,也不用想那么多。
在这里插入图片描述
在这里插入图片描述

shared_ptr

但是要是我们真的需要多个指针,管理一块空间那该怎么解决之前的那个问题呢?这时候就用到了shared_ptr。
shared_ptr的思想是用引用计数来解决多个指针指向同一块空间的问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上面我们可以看到,shared_ptr解决了之前的问题。那么上面实现的shared_ptr还有什么问题?线程安全问题。
在这里插入图片描述
在这里插入图片描述

我们可以看到,当n较小的时候并不会发生线程安全问题,但是当比较大的时候呢?
在这里插入图片描述
我们可以看到当n为10万的时候就发生了线程安全问题。
所以我们应该加锁。

线程安全的解决

在这里插入图片描述
在这里插入图片描述
我们可以看到加锁后,引用计数变的正常,智能指针也正常析构。这时大家肯就会有问题,为什么数据++的不正确?那么shared_ptr还是线程安全的吗?算。
在这里插入图片描述

循环引用

那么现在的shared_ptr就完整了吗?它还有没有什么问题?每次就是循环引用。
在这里插入图片描述
在这里插入图片描述
==我们可以看到最终对象没有被销毁。==那么没有循环引用呢?
在这里插入图片描述
==我们可以看到,没有循环引用时,对象被正常销毁。==那么该怎么解决这个问题呢?这时就用到了weak_ptr。

weak_ptr

weak_ptr的思想就是,只使用,不负责管理和释放。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除器

删除器需要我们自己写一个仿函数,显示传给智能指针
在这里插入图片描述

在这里插入图片描述
这里实现的是unique_ptr的删除器,shared_ptr的删除器底层实现比较麻烦大家有兴趣可以自己去了解。

相关文章:

【C++进阶】智能指针

文章目录为什么需要智能指针?内存泄漏什么是内存泄漏,内存泄漏的危害内存泄漏分类(了解)如何避免内存泄漏智能指针的使用及原理smart_ptrauto_ptrunique_ptrshared_ptr线程安全的解决循环引用weak_ptr删除器为什么需要智能指针&am…...

软件测试面试题 —— 整理与解析(3)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:🌎【Austin_zhai】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能&#xf…...

springboot常用的20个注解

Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringCloud集成, 而Spring Boot 之所以能够轻松地实现应的创建及与…...

USB组合设备——带鼠标功能的键盘

文章目录带鼠标功能的键盘一个接口实现报告描述符示例多个接口实现复合设备和组合设备配置描述符集合的实现报告的返回附 STM32 枚举日志复合设备:Compound Device 内嵌 Hub 和多个 Function,每个 Function 都相当于一个独立的 USB 外设,有自…...

数据结构与算法基础-学习-18-哈夫曼编码

一、个人理解在远程通讯中,需要把字符转成二进制的字符串进行传输,例如我们需要传输ABCD,我们可以用定长的字符串进行表示,例如:A:00B:01C:02D:03这样可能就造成空间的浪费,我们多存储了一个0号位。那用变长呢&#xf…...

ZMC408CE | 实现“8通道独立PSO”应用场景

一、ZMC408SCAN产品亮点 1.高性能处理器,提升运算速度、响应时间和扫描周期等; 2.一维/二维/三维、多通道视觉飞拍,高速高精; 3.位置同步输出PSO,连续轨迹加工中对精密点胶胶量控制和激光能量控制等; 4…...

QuickJS中JS_SetClassProto方法把JavaScript对象指定为某个类的原型对象

在 QuickJS 中,JS_SetClassProto 方法用于设置一个类的原型对象。这个方法的作用是将一个 JavaScript 对象指定为该类的原型对象,从而定义该类的属性和方法。 具体来说,JS_SetClassProto 方法的第一个参数是指向 QuickJS 引擎执行上下文的指…...

泰克信号发生器特点

泰克信号发生器是一种用于产生各种类型的电子信号的仪器,可以广泛应用于电子、通信、自动化、医疗等领域。泰克信号发生器具有以下特点:多种信号类型:泰克信号发生器可以产生多种类型的电子信号,包括正弦波、方波、三角波、脉冲等…...

贯穿设计模式第四话--里氏替换原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…...

6501: 鸡兔同笼

描述 一个笼子里面关了鸡和免子(鸡有两只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入 一个正整数a(a<32768)。 输出 包含两个正整数&#xff0c;第一个是最少的动物数&#xff0c;第二个是最多的…...

Linux项目自动化构建工具-make/makefile 介绍及使用

使用背景 在工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义一系列 规则来指定什么文件需要先编译&#xff0c;什么文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;或者更复杂 的功能操作 makefile带来的好处…...

【云原生|Docker】06-dokcerfile详解

目录 前言 Dockerfile基础示例 Dockerfile简介 1. Dockerfile概念 2. Dokcer镜像分层理解 ​3. Doker build构建原理 Dockerfile参数解析 1. Dokcerfile组成 2. 指令说明 2.1 FROM引入基础镜像 2.2 LABEL 2.3 ENV 2.4 RUN 2.5 COPY 2.6 ADD 2…...

【SCL】博图——先入先出排序法

使用博图SCL语言来实现先入先出排序 前言 使用SCL完成一个先入先出排序 具体要求&#xff1a;最先输入的一个数值&#xff0c;最先输出出来&#xff0c;下面的数自动向前填充&#xff1b; 注&#xff1a;这里可能有两种理解&#xff1a;一是第一个输入的第一个出来&#xff…...

OSPF----特殊区域

目录 OSPF----特殊区域 第一大类----末梢区域&#xff08;Stub Area&#xff09; 完全末梢区域&#xff08;(Totally Stub Area) 第二大类特殊区域----非完全末梢区域&#xff08;NSSA&#xff09; OSPF----特殊区域 第一大类----末梢区域&#xff08;Stub Area&#xff09…...

JVM-类加载

1&#xff1a;类加载机制&#xff1a; 加、验、准、解、初、使、卸 加、烟、准、姐、初、湿、鞋 加载、将class 文件转化为二进制流加载 JVM 内存中并生成一个该类的Class对象验证、Class 文件的字节流中包含的信息是否符合当前虚拟机的要求准备、在方法区中分配这些变量所…...

超详细讲解C语言文件操作!!

超详细讲解C语言文件操作&#xff01;&#xff01;什么是文件文件名文件的打开和关闭文件指针文件的打开和关闭文件的顺序读写文件的随机读写fseekftellrewind文本文件和二进制文件文件读取结束的判定文件缓冲区什么是文件 磁盘上的文件是文件。但是在程序设计中&#xff0c;我…...

linxu学习之进程

文章目录进程程序和进程产生进程销毁进程多进程高并发设计孤儿僵尸守护进程孤儿进程&#xff1a;守护进程(重点)僵尸进程&#xff1a;进程 程序和进程 操作系统可以运行多个程序&#xff0c;那他是如何运行的&#xff1f;实际上&#xff0c;CPU的执行是很快的&#xff0c;而待…...

蓝桥杯真题2

[蓝桥杯 2013 省 B] 连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题&#xff1a; 在 111 ~ NNN 的某个全排列中有多少个连号区间呢&#xff1f;这里所说的连号区间的定义是&#xff1a; 如果区间 [L,R][L, R][L,R] 里的所有元素&#xff08;即此排列的…...

PWM互补输出,以及死区时间计算

本文基于野火例程进行解说 实验内容 本次实验输出一对互补的pwm波&#xff0c;且进行死区时间的计算说明。 代码 互补输出对应的定时器初始化代码&#xff1a; bsp_advance_tim.c /********************************************************************************* fi…...

基于深度学习的海洋动物检测系统(Python+YOLOv5+清新界面)

摘要&#xff1a;基于深度学习的海洋动物检测系统使用深度学习技术检测常见海洋动物&#xff0c;识别图片、视频和实时视频中的海洋动物&#xff0c;方便记录、展示和保存结果。本文详细介绍海洋动物检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的实现代码…...

C# 计算方差

50&#xff0c;100&#xff0c;100&#xff0c;60&#xff0c;50 计算他们的方差 为了计算这些数的方差&#xff0c;需要进行以下步骤&#xff1a; 1. 计算平均值&#xff0c;即将这些数相加&#xff0c;然后除以它们的数量。 平均值 (50 100 100 60 50) / 5 72 2. 计…...

HJZS电源监视继电器HJZS-E202 AC220V

系列型号&#xff1a; HJZS-E202断电延时继电器 HJZS-E002断电延时继电器 一 应用 HJZS-E202电源监视继电器用于直流或交流操作的各种保护和自动控制的装置中&#xff0c;用以增加触点数量。 二 安装结构 导轨安装9壳体结构&#xff0c;具体尺寸参阅外型尺寸图。 三 产品型号…...

dolphinscheduler 2.0.6 资源中心改造方案二:通过NFS挂载共享目录

目录调度资源中心存储概要安装NFS服务器客户端调度验证关闭SFTP开关&#xff08;可忽略&#xff09;重新上传资源文件worker执行任务验证服务器woker客户端worker其它nfs共享目录的配置文件/etc/exports说明调度资源中心存储概要 针对现有的单机存储可以做哪些扩展&#xff1f;…...

基于集成学习的用户流失预测并利用shap进行特征解释

基于集成学习的用户流失预测并利用shap进行特征解释 小P&#xff1a;小H&#xff0c;如果我只想尽可能的提高准确率&#xff0c;有什么好的办法吗&#xff1f; 小H&#xff1a;优化数据、调参侠、集成学习都可以啊 小P&#xff1a;什么是集成学习啊&#xff0c;听起来就很厉害的…...

【Java版oj 】 day17杨辉三角形的变形、计算某字符出现次数

目录 一、杨辉三角形的变形 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、计算某字符出现次数 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代…...

智能驾驶芯片赛道混战:如何看待5类玩家的竞争格局?

智能驾驶芯片赛道&#xff0c;一直是业内关注的焦点。 高工智能汽车注意到&#xff0c;针对L0-L2&#xff0c;业内基本采用智能前视一体机&#xff08;IFC&#xff09;方案&#xff1b;要实现高速NOA、城市NOA等更为高阶的智驾功能等&#xff0c;则基本采用域控制器方案。从IF…...

vue antd table表格的增删改查(三)input输入框根据关键字模糊查询【后台管理系统 使用filter与indexOf嵌套】

vue antd table表格的增删改查&#xff08;三&#xff09;input输入框根据关键字查询【后台管理系统filter与indexOf嵌套】知识回调场景复现利用filter和indexOf方法实现模糊查询1.查询对象为单层的数组元素2.查询对象为多层的数组元素&#xff08;两层为例&#xff09;3.查询对…...

【计组】性能指标——速度

衡量计算机性能的指标之一——速度&#xff0c;是指计算机执行完所有指令所耗费时间的长短。 一、概念&#xff1a; 引出了如下概念&#xff1a;机器字长&#xff1a;指计算机一次能处理的二进制位数&#xff0c;也就是我们通常说的32位64位计算机中的位。 机器字长决定了计算…...

【PC自动化测试-4】inspect.exe 详解

1&#xff0c;inspect.exe图解" 检查 "窗口有几个主要部分&#xff1a;● 标题栏。 显示" 检查 HWND (窗口句柄) 。● 菜单栏。 提供对 检查功能 的访问权限。● 工具 栏。 提供对 检查功能 的访问权限。● 树视图。 将 UI 元素的层次结构呈现为树视图控件&…...

比肩ChatGPT的国产AI:文心一言——有话说

&#x1f517; 运行环境&#xff1a;chatGPT&#xff0c;文心一言 &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&am…...

什么是网站开发设计与实现/站长网站优化公司

微机原理实验总结不知不觉&#xff0c;微机原理与接口技术实验课程已经结束了。回想起来受益匪浅&#xff0c;主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言&#xff0c;对于学习机电工程的自动控制和计算机都是很重要的&#xff0c;因为它是和…...

上海市建设安全协会网站特种工/b站推广网站入口mmm

zipinfo在不解压的情况下&#xff0c;获取zip压缩文件的的详细信息。zipinfo列出了ZIP档案中有关文件的技术信息&#xff0c;最常见的是在MS-DOS系统上。这些信息包括文件访问权限、加密状态、压缩类型、版本和操作系统或压缩程序的文件系统等。默认的行为(没有选项)是列出存档…...

平台网站开发/52种新颖的促销方式

重要国策《文化产业振兴规划》于9月26日正式对外公布。巧合的是&#xff0c;就在前一天&#xff08;9月25日 &#xff09;&#xff0c;盛大游戏&#xff08;SDG&#xff09;成功在NASDAQ上市&#xff0c;并且创下了美股IPO规模之最&#xff08;10亿美元&#xff09;。1&#xf…...

wordpress爬取豆瓣电影简介/桔子seo查询

Nginx日志的默认路径 /var/log/nginx/ 重启nginx service nginx restart 检查文件是否有问题 nginx -t 配置文件生效 nginx -s reload...

四川网站建设 招标/太原关键词排名提升

1-6 字符串 在Go语言里面&#xff0c;字符串属于不可变数值类型&#xff0c;也就是是当变量的值发生改变时&#xff0c;其内存地址发生改变。在Go语言内部字符串是使用指针指向UTF-8数组。 当然&#xff0c;与不可变数值类型相反&#xff0c;可变数值类型的意思就是&#xff0…...

做网站賺钱/网站免费网站免费

Message:消息&#xff0c;其中包含了消息ID&#xff0c;消息处理对象以及处理的数据等&#xff0c;由MessageQueue 统一队列&#xff0c;终由Handler处理。 Handler:处理者&#xff0c;负责Message的发送及处理。使用Handler时&#xff0c;需要实现 handlerMessage(Message msg…...