当前位置: 首页 > 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
http://www.lryc.cn/news/389074.html

相关文章:

  • Unity中的的文件夹(特殊文件夹)
  • Go语言定时器Timer和Ticker到底怎么用
  • 41、web基础和http协议
  • 6-173 二分查找的关键字比较次数
  • 【基础篇】第5章 Elasticsearch 数据聚合与分析
  • 【网络安全】修改Host文件实现域名解析
  • Spring Boot 全面解析:从入门到实践案例
  • 222222222
  • Boost 智能指针
  • 在WSL Ubuntu中启用root用户的SSH服务
  • C语⾔数据类型和变量
  • 运行时类型信息(RTTI)
  • 使用 NVivo 定性数据分析软件指导癌症护理研究
  • R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性
  • 第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)
  • 容器化spring boot应用程序
  • 掌握智慧校园:资产来源功能解析
  • 基于公有云部署wordpress
  • vite+vue集成cesium
  • 2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文
  • 华为机试HJ1字符串最后一个单词的长度
  • 排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)
  • (2024)docker-compose实战 (6)部署前端项目(react, vue)
  • python 中的 下划线_ 是啥意思
  • Solana公链
  • 【LeetCode】反转字符串中的单词
  • [leetcode]文件组合
  • 数据库断言
  • uniapp+nodejs实现小程序支付
  • SolidityFoundry 安全审计测试 memory滥用