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 的析构息息相关:

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

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

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

在这里插入图片描述

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

在这里插入图片描述

谢谢

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

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

相关文章

Python3 逻辑运算符

前言 本文主要介绍python中的逻辑运算符&#xff0c;主要内容包括逻辑运算符简介、逻辑运算符优先级。 文章目录 前言一、逻辑运算符简介1、and(与) 运算2、or(或)运算3、not(非)运算 二、逻辑运算符优先级总结 一、逻辑运算符简介 逻辑运算符是用来做逻辑运算&#xff0c; …

13.RedHat认证-Linux Shell脚本

13.RedHat认证-Linux Shell脚本 Shell是一种脚本语言&#xff0c;那么&#xff0c;就必须有解释器来执行这些脚本。 bash&#xff1a;是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成&#xff0c;是BourneAgain Shell的缩写 sh&#xff1a;由Steve Bourne开发…

用大白话讲懂ceph与clinder的区别

Ceph是一个大仓库&#xff0c;而clinder只是食堂openstack的一个存储组件 详细解释如下&#xff1a; 当我们需要存储大量数据的时候&#xff0c;比如照片、视频、文件等&#xff0c;Ceph就像是一个巨大的仓库&#xff0c;可以帮助我们把这些数据安全地存放起来。 Ceph与传统的…

ABP框架+Mysql(二)

展示页面--图书列表页面 本地化 开始的UI开发之前,我们首先要准备本地化的文本(这是你通常在开发应用程序时需要做的).本地化文本在前端页面会常用。 本地化文本位于 Acme.BookStore.Domain.Shared 项目的 Localization/BookStore 文件夹下: 打开 en.json (英文翻译)文件并更…

STM32-- GPIO->EXTI->NVIC中断

一、NVIC简介 什么是 NVIC &#xff1f; NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller 。它 是内核的器件&#xff0c;所以它的更多描述可以看内核有关的资料。M3/M4/M7 内核都是支持 256 个中断&#xff0c;其中包含了 16 个系统中…

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…

Kmeans聚类模型

K均值(K-Means)聚类是一种常用的无监督学习算法,用于将数据集中的样本划分为K个不同的簇(cluster),使得每个样本都属于距离最近的簇的中心。K均值聚类的目标是通过最小化簇内样本的方差或欧氏距离的平方和来确定簇的中心,从而实现聚类分析。 一、Kmeans聚类模型原理 随…

CTF本地靶场搭建——GZ:CTF基础使用

GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台。 简介 GZ::CTF 是一个基于 ASP.NET Core 的开源 CTF 平台&#xff0c;采用 Docker 或 K8s 作为容器部署后端&#xff0c;提供了可自定义的题目类型、动态容器和动态分值功能。 本项目缘起于作者认为 CTFd 的实现不优雅&a…

Photoshop 首选项设置建议

Windows Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K macOS Ps菜单&#xff1a;Photoshop/首选项 Photoshop/Preferences 快捷键&#xff1a;Cmd K 对 Photoshop 的首选项 Preferences进行设置&#xff0c;可以提高修图与设计效率。下面是一些…

burp插件new_xp_capcha识别验证码的简易安装

1.new_xp_capcha 插件是大佬开发的可以正常白嫖&#xff0c;感谢大佬&#xff0c;我找了个不需要任何高级操作就可以做的安装手法&#xff0c;因为我在网上搜了一下就发现这个的安装过程攻略都还蛮复杂&#xff0c;我这里用了个简单的手法 2.安装 下载地址&#xff1a;smxia…

用Python获取Windows本机安装的所有应用程序的实现与分析

一个项目中需要获取本机安装的所有应用程序列表&#xff0c;花了一点时间研究了一下&#xff0c;分享出来。 主要通过访问注册表和桌面快捷方式来完成这一任务&#xff0c;因为注册表中获取到的应用程序列表不完全&#xff0c;因此通过桌面快捷方式进行补充。 导入所需模块 im…

上网是不是必须路由器和光猫之一负责拨号?

链接&#xff1a;https://www.zhihu.com/question/624856022/answer/3245182557 上网并非一定要“拨号”&#xff0c;使用固定IP地址可以直接上网&#xff0c;不需要拨号。你们公司的宽带属于商用宽带&#xff0c;运营商&#xff08;电信&#xff09;给配置了固定的IP&#…

Python面试宝典:Python中与单元测试相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十章:测试和调试:第一节:单元测试】 第二十章:测试和调试第一节:单元测试单元测试的关键概念:Python中的单元测试工具:使用unittest模块编写单元测试的基本步骤:示例代码面试…

不同程序猿的六一表情

初级 中级高级资深#猿脑2.0

小程序模板开发与定制开发的对比

一、引言 随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级的应用形态&#xff0c;已经深入到人们的日常生活和工作中。小程序以其无需安装、即用即走的特点&#xff0c;受到了广大用户的青睐。在小程序开发领域&#xff0c;模板开发和定制开发是两种常见的开发方式…

Linux: network: arp 导致问题一例

最近读openswitch的文档&#xff0c;看到下面一段话&#xff0c;说所有的CFM/BFD等协议&#xff0c;ARP修改相关的包都会经过slowpath/慢路径处理。 Performance Open vSwitch has a concept of a “fast path” and a “slow path”; ideally all packets stay in the fast pa…

[补题记录]LeetCode 6.Z字形变换

传送门&#xff1a;Z字形变换 转自&#xff1a;Z字形变换 Thought/思路 关键点在于&#xff0c;最后的答案是一行行连接起来的。 这样我们就会发现&#xff0c;这个 Z 字&#xff0c;实际上会让行数 不断加 1&#xff0c;然后又 不断减 1。每次按顺序选择 S 中的一个字符即…

基于C#使用ACCESS数据库时遇到的问题记录

一、32位版本Office与64位AccessDatabaseEngine共存安装方法 1. 使用winrar、7zip等软件将AccessDatabaseEngine_X64.exe解压缩&#xff0c;得到AceRedist.msi和files14.cat2个文件 2. 下载Orca MSI编辑修改工具。安装后&#xff0c;使用Orca打开AceRedist.msi&#xff0c;找到…

【JavaScript脚本宇宙】工具箱必备:文件处理库

不可或缺的开发工具&#xff1a;卓越的JavaScript文件操作库 前言 在这篇文章中&#xff0c;我们将深入探讨六个强大的JavaScript库&#xff0c;它们各自具有独特的功能和特性&#xff0c;能够极大地提升开发者的生产力。这些库包括用于客户端保存文件的库、CSV解析生成库、创…

【故障诊断】基于改进型的节点重构小波包频带能量谱结合概率神经网络 PNN实现轴承联合故障诊断附matlab代码

以下是基于改进型节点重构小波包频带能量谱结合概率神经网络&#xff08;Probabilistic Neural Network, PNN&#xff09;实现轴承联合故障诊断的MATLAB代码示例&#xff1a; matlab % 步骤1&#xff1a;节点重构小波包频带能量谱提取特征 function features extractFeatures…