vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 、auto 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长,再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析,注释。

(1 探讨一)当独占指针指向数组时,其默认的删除器是哪个?相关模板的定义轮廓如下:

在这里插入图片描述

我们要分析、猜测编译器在泛型推导时是如何确定模板参数的类型的。先给出一段源码,如下:

在这里插入图片描述

测试如下:

在这里插入图片描述

以及:

在这里插入图片描述
以及:

在这里插入图片描述

STL 库代码肯定是不会错的。可以得出结论啊: unique_ptr 声明时的模板参数 _Ty 的含义不同于模板定义时的模板参数 _Ty, 模板声明时的删除器的默认值是对第一个模板实参的整体取 default_delete<_Ty[]> ,所以选择了正确的删除器模板。

(2 探讨二) 独占指针可以指向数组,对其成员函数 reset 的形参,应该提供数组指针,而不是普通指针。源码摘抄如下:

在这里插入图片描述

增加一些打印语句:

在这里插入图片描述

以及:

在这里插入图片描述

但又测试了一下:

在这里插入图片描述

(3 探讨三) 独占指针的内存模型。独占指针的构造还是比较简单的,因为不需要考虑资源共享,独占指针其实就是对裸指针的封装。摘抄的源代码如下:

在这里插入图片描述

(4 探讨四) 对 make_unique 函数的形参,若创建指向数组的独占指针,函数形参是数组的长度;若创建指向普通对象的独占指针,函数形参是要传递给对象的构造函数的。依据源码如下:

在这里插入图片描述

该图中出现了 extent_V 模板的使用,其源码如下:

在这里插入图片描述

比较难以理解,给出几个测试结果如下:、

在这里插入图片描述

(5 探讨五) 本条探讨共享指针 shared_ptr 的内存模型。读代码,主要要先掌握弄清楚一个类的数据成员。这些指针中最难的当属共享指针。根据源码得出的结论如下(也附带给出弱指针 weak_ptr 的内存模型):

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8080e8c530a04690ad52d9f3ea4414e1.png

(6 探讨六)已知一个裸指针指向堆区的一个对象。共享指针可以根据裸指针构造 shared_ptr ,即存在这样的构造函数:

在这里插入图片描述

但不允许用裸指针构造弱指针 weak_ptr ,对弱指针不存在上面的类似的构造函数;但可以根据共享指针来构造弱指针,即存在:

在这里插入图片描述

而且根据源码得知:即使仅有一个共享指针指向堆区对象,该对象上的弱引用数量也初始化为一;若再根据共享指针构造一个弱指针,则该对象上的弱引用数量就为 2 。这没有为什么,源码就是这么写的。以 1 为弱引用的计数起点,肯定有其自圆其说的地方。
补充:强引用计数是为了管理智能指针指向的对象 ,弱引用计数是为了管理也在堆区中分配的 _Ref_count_base 的子类对象
测试如下:

在这里插入图片描述

对断点调试,当仅创建一个共享指针时:

在这里插入图片描述

当继续 F10 创建一个弱引用后:

在这里插入图片描述

(7 探讨七) 允许创建空的共享指针,弱指针和独占指针,测试代码如下:

在这里插入图片描述

因为一般咱们认为这些智能是要绑定到某个对象上的。但确实智能指针不必绑定到任何对象。因为 STL库中其模板都有空的默认构造函数:

在这里插入图片描述

以及:

在这里插入图片描述

以及:

在这里插入图片描述
以及具有 nullptr 默认值的父类:

在这里插入图片描述

(8 探讨八) 王建伟老师的课本里教的 用 make_shared 创建智能指针的效率更高。因为根据裸指针创建共享指针时候,是分两次分配内存,一次创建堆区待指向的对象,再次在堆区申请内存以创建引用控制块。而用 make_shared 函数,只申请一次堆区内存,创建了包含对象和其控制块的更大的对象。相应也减少了调用对象的构造和析构函数的次数,所以效率更高。是这样的。源码轮廓如下:

在这里插入图片描述

(9 探讨九) 依据弱指针创建共享指针是可以的。源代码里有这样的构造函数,其也会检查弱指针指向的对象是否还存在,否则再创建共享指针是违法的。代码依据如下:

在这里插入图片描述

再给出其调用链:

在这里插入图片描述

以及:

在这里插入图片描述
当然也可以用弱指针的成员函数 lock 创建共享指针,函数体的代码是一样的:

在这里插入图片描述

(10 探讨十) 重新思考下继承了 enable_shared_from_this 的类。咱们知道,根据指向对象 A 的裸指针连续两次构造共享指针,就出错了。若 A 继承了 enable_shared_from_this ,则可以调用 enable_shared_from_this 的 的成员函数来创建共享指针,实现了根据裸指针创建共享指针的那么个意思。核心就是因为 enable_shared_from_this 中 有一个数据成员 weak_ptr ,此弱指针包含了对象 A 的控制块信息。从而保证系统中创建的所有共享指针,共用唯一的引用控制块。从而保证对对象 A 的正确管理与析构。
先大概看一下 enable_shared_from_this 的构造与析构, copy 构造与赋值运算符的语义,其与共享指针、对象 A 的析构息息相关:

在这里插入图片描述
以下列出参考代码,待会分析相关对象的创建与析构:

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

接着依据上面的构造与析构函数举例分析:

在这里插入图片描述

另外补充下上面相关基类的析构函数,大部分都为空的其实。

在这里插入图片描述

谢谢

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

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

相关文章

微服务-Nacos-安装-集成SpringBoot

微服务-SpringCloud-ALibaba-Nacos Nacos 是阿里巴巴推出的 SpringCloud的组件 官网:什么是 Nacos 主要是为了解决微服务的架构中 服务治理的问题服务治理就是进行服务的自动化管理&#xff0c;其核心是服务的注册与发现。 服务注册&#xff1a;服务实例将自身服务信息注册…

【vue】vue2项目将npm包管理器修改为yarn包管理器

【vue】vue2项目将npm包管理器修改为yarn包管理器 1.删除node_modules文件夹、package-lock.json文件 2.全局安装yarn npm install -g yarn3.安装项目依赖 yarn install如果执行yarn install 报类似以下这种版本不兼容错误&#xff0c;执行 yarn config set ignore-engines …

[SWPUCTF 2023 秋季新生赛]Junk Code

方法一&#xff1a;手动去除 将所有E9修改为90即可 方法二&#xff1a;花指令去除脚本 start_addr 0x0000000140001454 end_addr 0x00000001400015C7 print(start_addr) print(end_addr) for i in range(start_addr,end_addr):if get_wide_byte(i) 0xE9:patch_byte(i,0x9…

【激光雕刻机上位机的成品软件】核心功能 - 参考wecreat

Software | WeCreat MakeIt! https://wecreat.com/pages/software 体验软件如上&#xff0c;自行下载体验。 价格5W&#xff0c;本人为 wecreat 创立之初上位机软件开发的核心员工&#xff0c;详细内容私信我。 由于该公司快3个月未给我竞业补偿了&#xff0c;对我不仁那我…

华为昇腾310 ATC模型转换、CPP推理案例使用

参考: https://cnloong.blog.csdn.net/article/details/139293689 https://gitee.com/ascend/samples/tree/master/inference/modelInference/sampleResnetQuickStart/cpp https://developer.huawei.com/consumer/cn/forum/topic/0203148227811150357 官方图像分类案例下载: …

数据结构与算法笔记:基础篇 - 链表(上):如何实LRU缓存淘汰算法

概述 本章聊聊 “链表” 这个数据结构。学习链表有什么作用&#xff1f; 我们先来讨论一个经典的链表应用场景&#xff0c;那就是 LRU 缓存淘汰算法。 缓存是一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中有着非常广泛地应用&#xff0c;比如场景的 CPU 缓…

字符串-将str1编辑成str2所需最小代价(hard)

一、题目描述 二、解题思路 该题目使用动态规划的思想来解决问题 刚开始我还在想&#xff0c;删除添加的操作可以等价为替换操作&#xff0c;如果替换操作的Cost大于删除添加组合操作的Cost之和就需要把 rcdcic。 但是在动态规划中&#xff0c;如果对三种不同的操作方式进行…

C++ 的 Tag Dispatching(标签派发) 惯用法

目录 1.概述 2.标准库中的例子 3.使用自己的 Tag Dispatching 3.1.使用 type traits 技术 3.2.使用 Type_2_Type 技术 4.Tag Dispatching的使用场景 5.总结 1.概述 一般重载函数的设计是根据不同的参数决定具体做什么事情&#xff0c;编译器会根据参数匹配的原则确定正确…

域内攻击--->基于资源的约束委派(RBCD)

不同于约束和非约束委派&#xff0c;基于资源的约束性委派可以就难的多了&#xff01;&#xff01; 前方高能 &#xff0c;准备上车&#xff01;&#xff01; 目录 1.基于资源的约束性委派(RBCD) 2.谁能设置RBCD 3.机器入域账号的普及 4.域树的搭建 5.配置RBCD 6.通过域创…

【前端部署——vercel】部署next.js使用了prisma的项目

部署流程参考 https://blog.csdn.net/qq_51116518/article/details/137042682 问题 PrismaClientInitializationError: Prisma has detected that this project was built on Vercel, which caches dependencies. This leads to an outdated Prisma Client because Prisma’s …

kali系统baopoWiFi密码

kali系统baopoWiFi密码,仅供学习 取决强大的密码字典,如果别人密码设置的足够安全,也无法破解成功,并不是100%破解 一、准备一个无线网卡&#xff0c;需要免驱动&#xff0c;最好知道频率2.4HGZ还是5.0GHZ 二、插上USB接口&#xff0c;vmware模拟器选择连接虚拟机 三、输入命…

Java Spring Boot 从必应爬取图片

获取图片主要就是通过必应图片页面控制台的元素&#xff0c;确认图片和标题在哪个类中&#xff08;浏览器 F12&#xff09; 引入依赖 这里需要引入两个依赖 jsoup 和 hutool maven依赖网站地址&#xff1a;Maven Repository: Search/Browse/Explore (mvnrepository.com) 挑选…

Java如何读取resources目录下的文件路径(九种代码示例教程)

本文摘要&#xff1a;Java如何读取resources目录下的文件路径 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f91…

翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL)

What a drag: Dragging a Uniform Resource Locator (URL) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p23133 Raymond Chen 2008年03月12日 麻烦的拖拽&#xff1a;拖拽统一资源定位符&#xff08;URL&#xff09; 简要 …

HALCON-从入门到入门-图像格式的互相转换

1.废话 上次说到了图片的读取和写入到本地&#xff0c;这次说一下图片的格式相关。 位图和矢量图 photoshop处理出来的图片肯定叫做图片&#xff0c;那么coreDraw处理出来的图片是不是也叫图片。 之间就有区分&#xff0c;一种叫做位图&#xff0c;一种叫做矢量图 位图和矢…

STM32作业实现(四)光敏传感器

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

曝光超1.5亿,迪丽热巴“抖音直播首秀”解锁德施曼智能锁科技革命

作为中国电商行业年中最大的消费狂欢节点&#xff0c;今年的618大促热闹依旧&#xff1b;各大品牌在今年极简的现货模式下展开了周期最长的品牌实力比拼。其中&#xff0c;高端智能锁领军品牌德施曼在618大促期间&#xff0c;携手代言人迪丽热巴&#xff0c;再次掀起智能锁消费…

【前端】Vuex笔记(超详细!!)

最近花了两周时间&#xff0c;完完全全的跟着Vuex官方的视频学完了Vuex并且详详细细的做了笔记&#xff0c;其中总结部分是我对于整个视频课程的总结&#xff0c;视频部分是跟着视频做的笔记&#xff0c;如果总结部分有不懂的话&#xff0c;直接去视频部分查找对应的笔记即可&a…

Codeforces Round 548 (Div. 2) C. Edgy Trees

Edgy Trees time limit per test: 2 second memory limit per test: 256 megabytes input: standard input output: standard output You are given a tree (a connected undirected graph without cycles) of n n n vertices. Each of the n − 1 n - 1 n−1 edges of the t…

计算机毕业设计 | SpringBoot招投标系统 任务发布网站(附源码)

1&#xff0c;绪论 在市场范围内&#xff0c;任务发布网站很受欢迎&#xff0c;有很多开发者以及其他领域的牛人&#xff0c;更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上&#xff0c;任务发布网站鱼龙混杂&#xff0c;用户需要找一个…