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

C++ STL unique_ptr智能指针源码剖析

由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习

源码剖析

一,模板参数

首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_ptr的删除器,typename _Dp = default_delete<_Tp>,这里自带了一个默认删除器,我们先看看默认删除器会做什么实现,

image-20240624120145763

可以看见默认删除器,就是直接将unique_ptr所持有的资源直接delete.

image-20240624115722542

内存布局

接下来我们再看看unique的内存布局,可以看见是由一个__uniq_ptr_data的模板类管理这对象以及删除器,通过类继承的抽丝剥茧,可以发现最后是__uniq_ptr_impl类包含一个元组,其参数为对象指针和删除器

image-20240624115817010

image-20240624120844587

  template <typename _Tp, typename _Dp>class __uniq_ptr_impl {using pointer = typename _Ptr<_Tp, _Dp>::type;private:tuple<pointer, _Dp> _M_t;}

maek_unique

这里可以看见,make_unique是直接new了一个对象,将指针交给unique_ptr进行管理,并没有使用STL空间配置器,原因在末尾总结说明

image-20240624121408231

总结

  1. unique_ptr的删除器默认使用delete直接释放内存
  2. unique_ptrshared_ptr不同,unique_ptr有删除器,shared_ptr没有
  3. unique_ptr底层使用tuple<pointer, 删除器>存储相关信息,由于是独占式,所以没有引用计数
    uple<pointer, 删除器>`存储相关信息,由于是独占式,所以没有引用计数
  4. make_unique使用new创建一个对象,而不是STL空间配置器,原因是unique_ptr的默认删除器使用delete

相关文章:

C++ STL unique_ptr智能指针源码剖析

由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习 源码剖析 一,模板参数 首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_p…...

Unity中的的文件夹(特殊文件夹)

Unity中的的文件夹(特殊文件夹) Unity工程中的关键文件夹和路径知识点, 以下是对Unity工程中几个关键文件夹和路径的总结&#xff1a; 1. 工程路径获取 ​ print(Application.dataPath) 用途&#xff1a;通常只在编辑模式下使用。注意事项&#xff1a;游戏发布后&#xff0…...

Go语言定时器Timer和Ticker到底怎么用

原文链接&#xff0c;可获取更多Go语言学习资料 概述 在日常开发中&#xff0c;我们不可避免的需要使用到定时任务用来处理业务逻辑。在Go语言中内置的有两个定时器&#xff0c;Timer和Ticker&#xff0c;合理的使用这两个定时器可以很好的解决定时任务的需求&#xff0c;同时…...

41、web基础和http协议

web基础与http协议 一、web web&#xff1a;就是我们所说得页面&#xff0c;打开网页展示得页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; world wide webwww 分布式图形信息系统 http&#xff1a;超文本传输协议 https&#xff1a;加密的超文本传输协议…...

6-173 二分查找的关键字比较次数

6-173 二分查找的关键字比较次数 - &#xff08;32&#xff09;专科段数据结构专项练习&#xff08;2024版&#xff09; (pintia.cn) int CountSearchTimes(int a[], int low, int high, int x) {int time0;while(low < high){int mid(lowhigh)/2;time;if(a[mid]x)return t…...

【基础篇】第5章 Elasticsearch 数据聚合与分析

在Elasticsearch的庞大功能体系中&#xff0c;数据聚合与分析扮演着至关重要的角色&#xff0c;它使我们能够从海量数据中提炼出有价值的信息&#xff0c;为决策提供依据。本章将深入探讨Elasticsearch的聚合功能&#xff0c;从基本概念到常见类型的实践&#xff0c;让你掌握如…...

【网络安全】修改Host文件实现域名解析

场景 开发一个网站或者服务&#xff0c;需要在本地测试时&#xff0c;可以将线上的域名指向本地开发环境的IP地址。从而模拟真实环境中的域名访问&#xff0c;方便调试和开发。 步骤 1、以管理员身份打开命令提示符 2、编辑hosts文件&#xff1a; 输入以下命令打开hosts文…...

Spring Boot 全面解析:从入门到实践案例

引言&#xff1a; Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;旨在简化 Spring 应用的初始搭建以及开发过程。它基于 Spring 平台&#xff0c;通过“约定优于配置”的原则&#xff0c;尽可能自动化配置&#xff0c;减少XML配置&#xff0c;使得开发者能够快速启…...

222222222

2222222...

Boost 智能指针

scoped_ptr 不能被复制或赋值给其他 scoped_ptr 对象&#xff0c;不能与其他指针比较 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr { public:// 构造函数&#xff1a;初始化 scoped_ptr 并接管指针的所有权explicit scoped_ptr(T* ptr n…...

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…...

C语⾔数据类型和变量

C语⾔数据类型和变量 1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&#…...

运行时类型信息(RTTI)

在计算机编程中,运行时类型信息(Runtime Type Information,简称RTTI)或运行时类型标识(Runtime Type Identification)是某些编程语言(如C++、Object Pascal、Ada)的一个特性,它允许在程序运行时获取对象的数据类型信息。RTTI可以用于所有类型,也只能用于显式启用RTTI…...

使用 NVivo 定性数据分析软件指导癌症护理研究

您是否曾因进行全面文献综述所需的大量研究而感到不知所措&#xff1f;在比较和整理大量冗长的出版物时&#xff0c;您是否不知道从哪里开始&#xff1f;幸运的是&#xff0c;这正是定性研究专家 Heidi Rishel Brakey 硕士擅长的领域&#xff0c;我们将在本案例研究中介绍这一点…...

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…...

第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)

解题思路 这道题目要求我们判断给定的飞机是否都能在它们的油料耗尽之前降落。为了寻找是否存在合法的降落序列&#xff0c;我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方法&#xff0c;尝试所有可能的降落顺序。 首先&#xff0c;我们需要理解题目中的条件。每架…...

容器化spring boot应用程序

容器化spring boot应用程序有多种方式&#xff0c;如基于简单的Dockerfile&#xff0c;多阶段Dockerfile以及基于Docker Compose等&#xff0c;我们将逐步给大家介绍&#xff0c;本节主要介绍基于简单的Dockerfile进行容器化spring boot的应用程序。 创建Spring boot应用程序 …...

掌握智慧校园:资产来源功能解析

在智慧校园的资产管理框架下&#xff0c;资产来源管理是确保资产数据完整性和合规性的重要一环。这一功能通过数字化手段&#xff0c;详尽记录每一项资产从何而来&#xff0c;无论是采购、捐赠、内部调拨&#xff0c;还是自制与改造&#xff0c;均需经过严格记录与追踪&#xf…...

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL&#xff08;或MariaDB&#xff09;和PHP&#xff08;或Perl、Python&#xff09;的首字母缩写&#xff0c;代表在Linux系统下使用Nginx作为Web服务器&#xff0c;MySQL作为…...

vite+vue集成cesium

1、创建项目、选择框架vuejs pnpm create vite demo_cesium 2、进入项目安装依赖 cd demo_cesium pnpm install3、安装cesium及插件 3、pnpm i cesium vite-plugin-cesium 4、修改vite-config.js import { defineConfig } from vite import vue from vitejs/plugin-vue impo…...

百度网盘解析工具:3步实现高速下载完全指南

百度网盘解析工具&#xff1a;3步实现高速下载完全指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度慢而烦恼吗&#xff1f;这款开源解析工具让您告…...

Graphviz自动排版太随机?教你5个技巧精准控制节点位置

Graphviz自动排版太随机&#xff1f;5个专业技巧精准控制节点位置 当你用Graphviz绘制关系图时&#xff0c;是否遇到过这样的困扰&#xff1a;明明代码逻辑清晰&#xff0c;生成的图表却总是不按预期排列&#xff1f;节点位置随机跳跃&#xff0c;关键元素错位&#xff0c;甚至…...

革新性硬件控制工具:OmenSuperHub实现游戏本性能优化与完全掌控

革新性硬件控制工具&#xff1a;OmenSuperHub实现游戏本性能优化与完全掌控 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普暗影精灵系列游戏本设计的开源硬件控制工具&#xff0c;提供完全离线的…...

OpenClaw自动化办公:nanobot镜像处理Excel与PPT文件

OpenClaw自动化办公&#xff1a;nanobot镜像处理Excel与PPT文件 1. 为什么选择OpenClaw处理办公文档&#xff1f; 上周五下午5点&#xff0c;当我面对第7个需要合并的Excel报表时&#xff0c;手指已经因为重复的复制粘贴动作开始发麻。作为团队里负责月度数据汇总的"表哥…...

欧拉Euler~21.10系统下OpenSSH 9.0升级与安全加固实战指南

1. 环境准备&#xff1a;从零搭建OpenSSH 9.0升级基础 在欧拉Euler~21.10系统上升级OpenSSH&#xff0c;就像给老房子换新门窗——既要保证新功能正常使用&#xff0c;又不能破坏原有结构。我最近刚在测试环境完成这套操作&#xff0c;整个过程踩过几个坑&#xff0c;这里把完整…...

Python原生AOT编译到底稳不稳?我们压测了7类生产负载:高并发API、实时流处理、边缘AI推理——结果出乎意料(附完整benchmark报告)

第一章&#xff1a;Python原生AOT编译方案2026实战案例全景概览Python原生AOT&#xff08;Ahead-of-Time&#xff09;编译在2026年已进入工程化落地深水区&#xff0c;主流方案如Nuitka 2.0、PyO3 Rust AOT Pipeline、以及新兴的CPython官方实验分支cpython-aot&#xff0c;均…...

Livox_ros_driver vs driver2:消息类型详解与ROS生态兼容性避坑指南

Livox_ros_driver与driver2深度对比&#xff1a;消息架构解析与ROS生态适配实战 当Livox发布HAP等新一代激光雷达时&#xff0c;技术团队常面临驱动版本选择的困境。livox_ros_driver与livox_ros_driver2看似只是版本迭代&#xff0c;实则反映了ROS生态中传感器接口标准化的深层…...

MX28智能舵机RS485底层驱动开发实战

1. MX28智能舵机底层驱动技术解析&#xff1a;基于RS485总线的嵌入式控制实现1.1 技术定位与工程价值MX28是Robotis公司推出的第二代高精度智能舵机&#xff08;Smart Actuator&#xff09;&#xff0c;采用RS485半双工差分总线通信&#xff0c;支持位置、速度、扭矩闭环控制及…...

STM32L152RE 32MHz时钟配置库:超低功耗MCU高频稳定启动方案

1. 项目概述ST_L152_32MHZ是一个专为 STMicroelectronics Nucleo-L152RE 开发板设计的轻量级时钟配置库&#xff0c;其核心目标是将系统主频&#xff08;SYSCLK&#xff09;从出厂默认的 32 kHz LSE 或 16 MHz HSI 稳定提升至32 MHz&#xff0c;并确保所有关键外设时钟&#xf…...

Protege新手避坑指南:搞懂‘类’、‘属性’和‘推理’到底怎么用(附常见错误排查)

Protege新手避坑指南&#xff1a;搞懂‘类’、‘属性’和‘推理’到底怎么用&#xff08;附常见错误排查&#xff09; 第一次打开Protege时&#xff0c;满屏的术语和复杂的界面可能会让你感到不知所措。作为一款强大的本体编辑工具&#xff0c;Protege确实有着陡峭的学习曲线。…...