全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++的std::unique_ptr如何自定义删除器_为C++智能指针指定特殊的资源释放逻辑

自定义删除器用于适配非标准资源释放方式,如malloc内存或C API句柄。1. 可用函数指针定义简单删除器,如free_deleter释放malloc内存;2. 用lambda结合decltype指定类型,实现灵活清理,如关闭文件;3. 使用仿函数定义复杂逻辑删除器,如SDL_Surface_deleter调用SDL_FreeSurface;4. 注意删除器影响类型大小,无状态更高效,且需处理空指针与异常安全。

在C++中,std::unique_ptr 默认使用 delete 来释放所管理的对象。但在某些场景下,资源的释放方式并非简单的 delete,比如用 malloc 分配的内存、C 风格 API 创建的文件句柄、或通过特定函数(如 SDL_FreeSurface)释放资源等。这时就需要为 std::unique_ptr 指定自定义删除器来正确回收资源。

自定义删除器的作用

自定义删除器是一个可调用对象(函数指针、函数对象、lambda 等),它定义了 unique_ptr 在析构时如何释放资源。通过指定删除器,可以让智能指针适配各种非标准的资源管理方式。

如何为 unique_ptr 添加自定义删除器

有两种常见方式:函数指针和函数对象(仿函数)。以下分别说明:

● 使用函数指针作为删除器

适用于简单的 C 风格清理函数。例如,释放由 malloc 分配的内存:

#include 
#include 

// 删除器函数 void free_deleter(int* ptr) { std::free(ptr); }

// 声明 unique_ptr 并指定删除器类型 std::unique_ptr)(int)> ptr( static_cast(std::malloc(sizeof(int))), free_deleter );

// 当 ptr 离开作用域时,会自动调用 free_deleter

● 使用 lambda 表达式(需配合 std::function 或直接推导)

更灵活的方式是使用 lambda,但注意不能直接用于模板参数(除非用 auto 推导)。通常结合 decltype 显式声明类型:

auto deleter = [](FILE* f) {
    if (f) std::fclose(f);
};

std::unique_ptr file_ptr(std::fopen("test.txt", "r"), deleter);

// 文件会在离开作用域时自动关闭

● 使用函数对象(仿函数)

定义一个类并重载 operator(),适合需要状态或复杂逻辑的删除器:

struct SDL_Surface_deleter {
    void operator()(SDL_Surface* ptr) const {
        if (ptr) SDL_FreeSurface(ptr);
    }
};

std::unique_ptr surface_ptr( IMG_Load("image.png") );

注意事项与最佳实践

自定义删除器会影响 unique_ptr 的类型大小。如果删除器是函数指针或空 lambda,通常不会增加开销;但如果删除器包含状态(如捕获变量的 lambda),可能导致智能指针变大。

  • 尽量使用无状态 lambda 或函数指针以保持轻量
  • 避免在删除器中抛出异常
  • 确保删除器能正确处理空指针(如 fclose 可以,但有些 API 不行)
  • 构造 unique_ptr 时必须同时传入指针和删除器

基本上就这些。只要理解删除器的本质是一个“怎么释放”的策略,就能灵活应用于各种资源管理场景。


# c++  # 作用域  # fclose  # auto  # Lambda  # 指针  # operator  # 空指针  # delete  # function  # 对象  # 自定义  # 是一个  # 句柄  # 资源管理  # 非标准  # 就能  # 但在  # 适用于  # 会在  # 应用于 


相关文章: ,网页ppt怎么弄成自己的ppt?  如何通过VPS建站无需域名直接访问?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  黑客如何通过漏洞一步步攻陷网站服务器?  建站之星在线客服如何快速接入解答?  如何基于PHP生成高效IDC网络公司建站源码?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  C#如何序列化对象为XML XmlSerializer用法  建站之星如何快速解决建站难题?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  用v-html解决Vue.js渲染中html标签不被解析的问题  公众号网站制作网页,微信公众号怎么制作?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  专业网站建设制作报价,网页设计制作要考什么证?  制作网站外包平台,自动化接单网站有哪些?  重庆市网站制作公司,重庆招聘网站哪个好?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  建站VPS配置与SEO优化指南:关键词排名提升策略  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  自助网站制作软件,个人如何自助建网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何通过NAT技术实现内网高效建站?  如何通过西部建站助手安装IIS服务器?  如何选择香港主机高效搭建外贸独立站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  浅谈Javascript中的Label语句  创业网站制作流程,创业网站可靠吗?  h5在线制作网站电脑版下载,h5网页制作软件?  网站制作的步骤包括,正确网址格式怎么写?  焦点电影公司作品,电影焦点结局是什么?  建站之星如何一键生成手机站?  如何快速搭建个人网站并优化SEO?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何快速查询网站的真实建站时间?  如何通过建站之星自助学习解决操作问题?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  建站之星logo尺寸如何设置最合适?  建站之星安装提示数据库无法连接如何解决?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  金*站制作公司有哪些,金华教育集团官网?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  网站制作公司,橙子建站是合法的吗?  如何快速生成可下载的建站源码工具?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  建站之星代理商如何保障技术支持与售后服务? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。