智能指针的deleter机制

2023-11-18

一、介绍

智能指针的deleter机制是指,当智能指针的引用计数降为0时,智能指针会自动调用一个指定的析构函数(deleter)来释放所管理的内存。这个析构函数通常是一个函数对象,可以是一个函数指针、一个lambda表达式或者一个重载了函数调用运算符的类对象。智能指针的deleter机制可以确保在任何情况下都能正确地释放内存,包括在异常情况下和多线程环境下。

二、std::unique_ptr 的 deleter 机制

智能指针的deleter机制是指用于管理资源释放的方式。不同类型的智能指针有不同的deleter机制

unique_ptr 在 <memory> 中的定义如下:

// non-specialized

template <class T, class D = default_delete<T>> class unique_ptr;

// array specialization

template <class T, class D> class unique_ptr<T[],D>;

其中 T 指其管理的对象类型,D 指该对象销毁时所调用的释放方法,可以使用自定义的删除器,他也有一个默认的实现,即 detele 操作。

默认情况下,std::unique_ptr 使用 std::default_delete 作为其 deleter,它会调用 delete 来释放资源。例如:

std::unique_ptr<int> ptr(new int);  // 使用 std::default_delete 作为 deleter

 自定义deleter

int main()
{
    {
        std::unique_ptr<int,void(*)(int*)> ptr(new int(10), [] (int* p) {
            std::cout << "delete resource value " << *p << std::endl;
            delete p;
        });  // 使用 lambda 表达式作为自定义 deleter
    }

    system("pause");
    return 0;
}

三、std::shared_ptr 的 deleter 机制

  • std::shared_ptr 是一种共享所有权的智能指针,可以在多个 std::shared_ptr 之间共享资源。
  • std::shared_ptr 的 deleter 是通过模板参数指定的类型,默认情况下使用 std::default_delete
  • std::shared_ptr 的 deleter 机制是在最后一个持有资源的 std::shared_ptr 被销毁时释放资源。
std::shared_ptr<int> ptr(new int);  // 使用 std::default_delete 作为 deleter

自定义 deleter:

  • 除了使用默认的 deleter,你也可以自定义 deleter 来管理资源的释放。自定义 deleter 可以是函数指针、函数对象或 lambda 表达式。
  • 自定义 deleter 可以在智能指针的构造函数中进行指定。
std::shared_ptr<int> ptr(new int, [](int* p) { delete p; });  // 使用 lambda 表达式作为自定义 deleter

总结来说,智能指针的 deleter 机制决定了在何时以及如何释放资源。std::unique_ptr 通过转移所有权或释放资源来释放资源,而 std::shared_ptr 则在最后一个持有资源的指针被销毁时释放资源。你可以使用默认的 deleter,也可以自定义 deleter 来管理资源的释放。 

 参考:

智能指针 unique_ptr 详解_顺其自然~的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能指针的deleter机制 的相关文章

随机推荐

  • (邱维声)高等代数课程笔记:极大线性无关组,向量组的秩

    极大线性无关组 向量组的秩 quad 一般地 设 V V V 是数域 K K K 上的一个线性空间
  • 好用的网络请求库Retrofit2(入门及讲解)

    前言 首先 先给出官网 GitHub Retrofit 官网 Retrofit 其次 要吐槽一下官网首页给出的例子 如果你照着例子改 会发现根本没法运行 不是少包就是少关键语句 相关内容可以参看我的另一篇文章 Retrofit 2 0 入门
  • 【论文翻译】边缘应用中加速卷积神经网络的剪枝算法综述

    摘要 随着卷积神经网络 CNN 模型大小的增加 模型压缩和加速技术对于在边缘设备上部署这些模型变得至关重要 在本文中 我们对修剪进行了全面的调查 这是一种主要的压缩策略 可以从CNN模型中删除非关键或冗余的神经元 调查涵盖了修剪的总体动机
  • VC++设置与取得系统音量

    MMRESULT rc 多媒体函数返回结果变量 HMIXER hMixer 混合器设备句柄 MIXERLINE mxl 音频线路标准状态信息结构体 MIXERLINECONTROLS mxlc 音频线路控制器集合信息结构体 MIXERCON
  • 启动arbiter失败Oplog entry at { ts: Timestamp 1651735515000

    mongodb版本是 mongodb linux x86 64 3 4 2 tgz 操作系统 中标麒麟服务器版 问题 查看日志 日志里面提示 2022 05 06T14 27 50 862 0800 I REPL initandlisten
  • SUSAN边缘检测算法,及其Matlab和OpenCV实现

    1 SUSAN边缘检测计算步骤 1 在图像上放置一个37个像素的圆形模板 模板在图像上滑动 依次比较模板内各个像素点的灰度与模板核的灰度 判断是否属于USAN区域 判别函数如下 其中 r 0 vec r 0 r
  • 解决移动端shader找不到问题

    在Unity里面 编辑器特效正常 移动端特效无效 adb输出是找不到shader 打开Graphics面板 把找不到的shader添加进去
  • [python] 下载天地图切片地图

    下载xyz地图 资源 下列为常用xyz路由地址 为了避免图片中出现文字标注 道路名称 建筑物名称等 本文选择天地图tian vec 作为获取资源对象 var mapUrl 高德地图 lang可以通过zh cn设置中文 en设置英文 size
  • RNN详解及BPTT详解

    转自 https blog csdn net zhaojc1995 article details 80572098 本文部分参考和摘录了以下文章 在此由衷感谢以下作者的分享 https zhuanlan zhihu com p 28054
  • Android系统system用户权限和root权限的获取

    在Android系统中 系统为每一个应用程序 apk 创建了一个用户和组 这个用户和组都是受限用户 不能访问系统的数据 只能访问自己的文件和目录 当然它也不能访问其他应用程序的数据 这样设计可以尽可能地保护应用程序的私有数据 增强系统的安全
  • 华为校招机试题-寻找链表的中间结点-2023年

    题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点 则输出第二个中间结点保存的数据 例如 给定 L 为 1 7 5 则输出应该为 7 给定 L 为 1 2 3 4 则输出应该为 3 输入描述 每个输入包
  • echart - 圆角环形图 -模板

    一 最近遇到圆角环形图的需求 搞了半天 才找到一个合适的模板 在这里就分享给大家 希望对有需求的小伙伴有所帮助 废话不多说 先贴效果图 然后再贴源码 tip 大家记得要引入一下echart js的文件啊 这样才可以显示出来 路径记得找的要对
  • QT QLabel样式设置

    需要设置error的样式 设置样式 color rgb 255 0 0 font size 12pt font family Microsoft YaHei 字体 颜色也可通过富文本设置在程序中设置 emit LoginError QStr
  • 一文带你了解如何编写自动化测试用例

    自动化测试脚本 什么是自动化测试 自动化测试是验证和验证软件是否满足所有用户需求 并使用自动化工具按预期运行 它检查在产品开发阶段期间和之后出现的错误 问题和其他类型的缺陷 这种类型的软件测试运行在由测试工具处理的编程脚本上 有多种测试工具
  • 关于rider引入使用nuget无法加载包的解决方式

    关于rider引入使用nuget无法加载包的解决方式 这个问题已经是困扰我三天了 因为C 使用rider开发的人相对较少 也可能是我自身遇到这个问题比较特殊 终于找到了nuget无法引入包的解决方案 首先看图 我在Nuget下面查找Nuni
  • 蓝桥杯基础练习VIP——矩阵乘法——快速幂

    题目https www dotcpp com oj problem1472 html 1 普通做法 循环嵌套 n m list map int input split mat for i in range n row list map in
  • uniapp 仿网易云音乐播放器 微信小程序

    效果视频 uniapp 仿照网易云播放器功能 效果截图 上代码
  • pxe无盘服务器教程,[教程]Synology+PXE挂载iSCSI网络无盘启动Win7(08.04更新)

    本帖最后由 shuaiking 于 2020 5 16 09 32 编辑 前言 之前发了一篇关于 synology部署无盘win7的帖子https www chiphell com thread 823492 1 1 html 教程本想找个
  • Android Studio 从安装到第一个Android 应用Demo

    安装Android Studio 安装需要 上网 我这挺顺利的 就是在官网下载安装包 一路 Next 大概连下载总共半个小时 第一个应用 参考官方教程 https developer android com codelabs basic a
  • 智能指针的deleter机制

    一 介绍 智能指针的deleter机制是指 当智能指针的引用计数降为0时 智能指针会自动调用一个指定的析构函数 deleter 来释放所管理的内存 这个析构函数通常是一个函数对象 可以是一个函数指针 一个lambda表达式或者一个重载了函数