0

0

C++中如何实现自定义删除器 智能指针中自定义资源释放方法

P粉602998670

P粉602998670

发布时间:2025-06-29 13:03:02

|

978人浏览过

|

来源于php中文网

原创

c++++中使用智能指针时,若需自定义资源释放逻辑,可通过绑定删除器实现,具体方式因指针类型而异。1. unique_ptr需显式指定删除器类型并传入函数或仿函数,如void my_deleter(myresource* ptr),构造时传递其地址;2. shared_ptr可直接接受可调用对象作为删除器,无需额外模板参数,支持函数、lambda、仿函数等;3. 设计删除器时应避免抛出异常、避免捕获外部状态的lambda、注意删除器类型影响指针兼容性,并避免耗时操作。例如管理文件句柄时可用lambda执行fclose。掌握这些要点有助于正确高效地处理特殊资源。

C++中如何实现自定义删除器 智能指针中自定义资源释放方法

在 C++ 中使用智能指针时,如果默认的资源释放方式不满足需求(比如操作的是非内存资源、需要特殊清理逻辑等),就需要自定义删除器。智能指针如 std::unique_ptrstd::shared_ptr 都支持传入自定义删除器来控制资源释放过程。

C++中如何实现自定义删除器 智能指针中自定义资源释放方法

1. unique_ptr 如何绑定自定义删除器

unique_ptr 默认会调用 delete 来释放资源,但你可以通过模板参数指定删除器类型,并在构造时传入具体的删除函数或仿函数。

C++中如何实现自定义删除器 智能指针中自定义资源释放方法

基本写法:

立即学习C++免费学习笔记(深入)”;

void my_deleter(MyResource* ptr) {
    // 自定义清理逻辑
    delete ptr;
}

std::unique_ptr ptr(new MyResource(), &my_deleter);

注意这里必须显式指定第二个模板参数为函数指针类型,否则编译器无法推导出删除器类型。

C++中如何实现自定义删除器 智能指针中自定义资源释放方法

如果你希望更简洁地管理删除器,可以用 lambda 表达式结合 std::function 或者使用 std::unique_ptr 的别名模板。


2. shared_ptr 更灵活的删除器支持

相比 unique_ptrshared_ptr 在构造时可以直接接受一个可调用对象作为删除器,不需要额外指定模板参数,使用起来更加方便。

Red Panda AI
Red Panda AI

AI文本生成图像

下载

示例:

auto my_deleter = [](MyResource* ptr) {
    // 执行一些清理工作
    delete ptr;
};

std::shared_ptr ptr(new MyResource(), my_deleter);

这里的删除器可以是函数、lambda、仿函数,甚至 std::function 对象。shared_ptr 内部会拷贝这个删除器并保存下来,在最后一个引用失效时调用它。

需要注意的一点是,删除器和资源是绑定在一起的,即使你把 shared_ptr 转换成了指向基类的指针,删除器也会保持正确的行为。


3. 删除器的设计注意事项

设计删除器时有几个细节容易被忽略:

  • 删除器不能抛出异常:因为资源释放通常发生在析构过程中,一旦抛出异常可能导致程序崩溃。
  • 避免捕获外部状态的 lambda:如果你用了带捕获的 lambda 做删除器,确保其生命周期足够长,或者不会造成悬空引用。
  • 删除器类型会影响智能指针的类型:对于 unique_ptr,不同的删除器会导致不同的指针类型,影响赋值兼容性。
  • 不要在删除器中做耗时操作:尤其是在多线程环境下,长时间执行删除器可能会影响性能。

举个例子,如果你管理的是文件句柄或其他系统资源,删除器里可能不只是 delete,还可能是 fcloseclose(fd) 等:

auto file_deleter = [](FILE* f) { if (f) fclose(f); };
std::shared_ptr fp(fopen("test.txt", "r"), file_deleter);

这样就能安全地自动关闭文件了。


基本上就这些。自定义删除器虽然不是每天都要用的功能,但在处理特殊资源时非常有用,理解它的使用方式和限制能让你写出更健壮的代码。

相关专题

更多
fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

321

2023.11.30

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

187

2025.11.08

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

469

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

106

2025.12.24

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

266

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

0

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.6万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号