智能指针的deleter机制

news/2024/10/18 12:19:50/

一、介绍

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

二、std::unique_ptr 的 deleter 机制

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

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

// non-specializedtemplate <class T, class D = default_delete<T>> class unique_ptr;// array specializationtemplate <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博客


http://www.ppmy.cn/news/708580.html

相关文章

HTML插入一条竖线

处理方式&#xff1a; 1、图片&#xff08;略&#xff09; 2、字符&#xff1a;就跟普通的其他字符一样就可以 eg:| 3、边框:border-left或者border-right 4、背景颜色 假如那条竖线是100px的话&#xff0c;使用定位在那个位置写一个height100px&#xff0c;width1px&…

盒马上市,即时零售最大“变量”

若盒马年内成功上市&#xff0c;等待完成下一轮融资的朴朴超市的处境恐将更加尴尬&#xff0c;另区域性中小商超或将迎来新一轮倒闭潮。 疫情过后&#xff0c;国内消费市场一直处于走弱态势。据商务大数据监测&#xff0c;今年端午假期&#xff0c;部分地区零售和餐饮数据远不及…

100天SQL面试刷题 Day003

先看题目自己试着解一下,有困难的同学可以先看考点解析试下, 最后再看SQL解答,有不同意见和解法的欢迎评论区留言交流 快速定位 题目:结果输出考点解析SQL代码来源:大厂面试真题 题目: 【1】现有交易数据明细表 user_goods_table 如下: user_name 用户名 date 下单日期 …

艾美捷抗人白介素8(CXCL8)单抗MT8H6特性研究

艾美捷Mabtech抗人白介素8&#xff08;CXCL8&#xff09;单抗MT8H6能够在ELISA REACTIVITY中敏感和特异地检测人IL-8人/NHP 6人IL-8FORMA结合推荐MT8H6作为人ELISA中的捕获抗体&#xff0c;与生物素化检测抗体MT8F19。 艾美捷抗人白介素8&#xff08;CXCL8&#xff09;单抗MT8H…

Maxio MAS0902A贴英特尔B16A颗粒速度测试

最近一直在倒腾U盘&#xff0c;发现还有两片英特尔的B16A颗粒&#xff0c;丝印29F01T2ANCTH2。另外还有两片镁光降级片B27A。一开始打算贴在3280上的&#xff0c;后来感觉掉速难受得很&#xff0c;于是从犄角旮旯翻了几个SSD废板子&#xff08;就是拆颗粒剩下的&#xff09;&am…

k8s内部域名解析

1、创建busybox容器&#xff0c;检查域名解析 [rootmaster01 demo]# kubectl run -it --imagebusybox:1.28.4 --rm --restartNever bash / # nslookup kubernetes Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kubern…

RuoYi-Vue Swagger 上传文件接口

前言 RuoYi-Vue&#xff1a; v3.8.5swagger 1.6.2 &#xff08;https://github.com/swagger-api/swagger-core, https://gitee.com/mirrors/swagger-core&#xff09; Swagger 上传接口定义 ApiOperation(value "图片上传") PostMapping(value "/upload&qu…

Java IDE实现天气预报以及给指定手机发送验证码、MQTT自定义天气预报

目录 一、天气预报实现1. 代码分析2.URL类3.API列表4.全部代码5.实现效果 二、给指定手机发送验证码1.准备工作2.执行代码3.运行结果 三、MQTT自定义天气预报1.MQTT2.MQTT服务器下载3.MQTTBox客户端工具的安装4.建立天气预报主题 四、参考资料五、总结 一、天气预报实现 1. 代…