Modern C++ std::shared_ptr的实现原理

shared_ptr的UML图

注意:这是Linux上GCC 8.5.0的实现版本
先看下它的继承关系。
在这里插入图片描述

shared_ptr里面的数据成员

有了上面的UML图,可能还没有一个直观的认识,下面我们把这些成员打印出来。
当然得先写个小小的程序:

$ cat shared_ptr.cpp
#include <memory>
#include <iostream>int main(){int* ip = new int(100);std::shared_ptr<int> is1(ip);std::shared_ptr<int> is2(is1);std::cout<<"use count:"<<is2.use_count()<<std::endl;return 0;
}

is1构造完后,看下它的值:
在这里插入图片描述
is1有两个成员变量:

  1. _M_ptr: 为真正的指针的值,本例中即整形的地址。
  2. _M_refcount: 为__shared_count类型,仅包含一个指针,这个指针指向new出来的另外一个对象它包含两个整形成员(_M_use_count, _M_weak_count)

从内存角度看图是这样的:
在这里插入图片描述

小知识点:private是限制编译的,GDB是能访问它修饰的成员变量的。

shared_ptr的构造

相信看完上面的各种图和数据,大家应该能想想出来构造的过程。
这次我们step into第六行
在这里插入图片描述
shared_ptr的构造函数调用了基类__shared_ptr的构造函数
在这里插入图片描述
之后new了一个_Sp_counted_ptr,我就不一步步走下去了。

另外提一句,_M_use_count和_M_weak_count都是_Atomic_word类型,其实就是int。

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

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

相关文章

21.云原生之GitLab pipline语法实战(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

贾玲新片刚刚发出紧急声明,是什么情况。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 1月22日&#xff0c;一则“多位明星参演的电影涉影视投资诈骗…

【创建vue项目的两种方式】

Vue环境搭建 NodeJs安装包安装淘宝镜像 环境搭建webpack安装全局安装vue/cli查看模板创建项目1.webpack2. vue-cli NodeJs安装包 下载链接&#xff1a;官网链接 下载下来后&#xff0c;直接傻瓜式的安装即可。 通过在cmd控制台输入以下命令查看是否安装成功 node -v因为适配某…

架构学习(一):scrapy实现按脚本name与日期生成日志文件

原生scrapy日志机制 一般情况下&#xff0c;我们可以直接在setting文件中定义日志文件&#xff0c;这种会把所有脚本的日志都写在同一个文件 LOG_LEVEL INFO # 日志级别 LOG_STDOUT True # 日志标准输出 LOG_FILE rD:\python\crawler\logs\1163.log # 日志文件路径现在…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

【Java 数据结构】List接口详解

List 1. 什么是List2. 常见方法介绍3. List的使用 1. 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c; Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历的&#xff0c;具…

element-UI上传文件后valid提示不消失

问题描述&#xff1a;上传文件完成后&#xff0c;必填信息提示不消失 解决方法&#xff1a;在<el-form-item>标签添加show-message属性&#xff0c;字段为空时才显示提示信息 <el-form-item :prop"fileList" :show-message"!form.fileList || !form.f…

详解矩阵的LDU分解

目录 一. 矩阵分解 二. 解方程 三. 例题说明 四. 矩阵的LDU分解 五. 矩阵三角分解的唯一性 一. 矩阵分解 其实我们可以把一个线性系统&#xff08;Linear System&#xff09;看成两个三角系统&#xff08;Triangular Systems&#xff09;&#xff0c;本文章将解释为什么可…

基于Mybatis,Vue,ajax,ElementUI实现的增删改查

下面是项目获取连接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/158eyyhg2X1bQtMEVT1ut1Q?pwd1234 提取码&#xff1a;1234 界面如下&#xff1a;

外卖跑腿系统开发:构建高效、安全的服务平台

在当今快节奏的生活中&#xff0c;外卖跑腿系统的开发已成为技术领域的一个重要课题。本文将介绍如何使用一些常见的编程语言和技术框架&#xff0c;构建一个高效、安全的外卖跑腿系统。 1. 技术选择 在开始开发之前&#xff0c;我们需要选择适合的技术栈。常用的技术包括&a…

如何看待程序员抄代码还拿着高薪这一说法?

程序员的工资构成&#xff1a;会复制粘贴值1块&#xff0c;知道去哪复制值5K&#xff0c;知道粘贴在哪值10K&#xff0c;粘贴完了能跑起来值15 有人说&#xff1a;能带领一伙人复制粘贴值20k。 有人说&#xff1a;能写一个自动复制粘贴的系统值30k。 有人纳闷问到&#xff1a…

pinia实现todos

store/todos.js //导入defineStore import {defineStore} from pinia const userTodosStoredefineStore(todos,{ state:()>({// list:[// {id:1,name:吃饭,done:false},// {id:2,name:睡觉,done:true},// {id:3,name:打豆豆,done:false}// ],list:JSON.parse(l…