当前位置: 首页 > 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…...

Windows安卓应用安装终极指南:APK-Installer完整教程

Windows安卓应用安装终极指南&#xff1a;APK-Installer完整教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松安装安卓应用吗&#xff1f;APK…...

存储性能指标全解析:从IOPS到响应时间的实战指南

1. 存储性能指标入门&#xff1a;从买菜到地铁的日常类比 刚接触存储性能指标时&#xff0c;那些英文缩写就像天书一样让人头疼。其实这些概念在我们生活中随处可见&#xff0c;只是换了个马甲而已。想象一下早高峰的地铁站&#xff1a;IOPS就像每分钟通过闸机的人数&#xff0…...

从数学建模到真实运维:如何用调度模型优化你校园里的共享单车?

从数学建模到真实运维&#xff1a;校园共享单车调度系统的工业级设计实践 清晨7点的校园东门&#xff0c;总能看到一群学生围着仅剩的几辆共享单车"抢车"的场景&#xff1b;而下午3点的体育馆停车点&#xff0c;却堆积着数十辆无人问津的车辆。这种供需错配现象背后&…...

AIGlasses_for_navigation视频处理应用:使用AE制作导航效果演示片段视频

AIGlasses_for_navigation视频处理应用&#xff1a;使用AE制作导航效果演示片段视频 你有没有想过&#xff0c;那些看起来科技感十足、路径光效流畅的AR导航演示视频是怎么做出来的&#xff1f;是不是觉得需要专业的动画团队才能实现&#xff1f; 其实&#xff0c;借助像Afte…...

ANPC-VSG(虚拟同步机)控制,基于有源中点钳位三电平的VSG构网型逆变器控制,采用LCL...

ANPC-VSG&#xff08;虚拟同步机&#xff09;控制&#xff0c;基于有源中点钳位三电平的VSG构网型逆变器控制&#xff0c;采用LCL型滤波器&#xff0c;电压电流双闭环控制。 1.VSG控制 2.中点电位平衡控制 3.电压电流双闭环控制 4.提供参考文献以及VSG原理和下垂系数计算方法 支…...

CoPaw长文本处理极限测试:百万token上下文摘要与问答

CoPaw长文本处理极限测试&#xff1a;百万token上下文摘要与问答 1. 开场白&#xff1a;当AI遇上超长文本 最近遇到一个朋友吐槽&#xff1a;"我们公司那些技术文档动辄几百页&#xff0c;找点关键信息跟大海捞针似的。要是AI能帮忙就好了&#xff0c;但试了几个工具&am…...

STM32CubeIDE实战:HAL库串口中断接收的5个常见坑点及解决方案

STM32CubeIDE实战&#xff1a;HAL库串口中断接收的5个常见坑点及解决方案 在工业传感器数据采集、设备间通信等场景中&#xff0c;稳定可靠的串口通信往往是嵌入式开发的关键环节。许多开发者在使用STM32CubeIDE配合HAL库实现串口中断接收时&#xff0c;虽然能够快速搭建基础功…...

python-flask-djangol框架的减肥健身养生人士饮食营养管理系统

目录 技术选型与框架搭建核心功能模块设计数据模型设计示例&#xff08;Django ORM&#xff09;算法实现要点部署与扩展 项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 技术选型与框架搭建 Python Flask/Django框架均适合开发…...

全民拼购的“低门槛+全权益”,到底戳中了商业的哪个命门

一、先给全民拼购画个像&#xff1a;不是“割韭菜”&#xff0c;是“普惠式信任游戏”老陈一开始也怕&#xff1a;“拼购不都是‘砍一刀免费拿’‘拉3人返现’吗&#xff1f;我可不想踩红线。”我跟他说&#xff1a;新型全民拼购和传统拼购的本质区别&#xff0c;是“从‘赚快钱…...

新手必看:在快马平台通过实践项目轻松理解rag工作原理

今天想和大家分享一个特别适合新手理解RAG&#xff08;检索增强生成&#xff09;技术的实践项目。作为一个刚接触NLP的小白&#xff0c;我发现通过动手实践比单纯看理论文档要高效得多。下面就用最简单的代码带大家走通RAG的核心流程&#xff0c;全程在InsCode(快马)平台上完成…...