C++中std::unique_ptr如何自定义删除器_C++智能指针管理非内存资源【经验】-C++

std::unique_ptr的删除器必须是可默认构造的可调用类型,且作为模板参数显式指定;lambda仅空捕获时可用,否则需用functor类封装状态与上下文逻辑。

std::unique_ptr 的删除器必须是可调用对象,且类型需在模板参数中显式声明

默认情况下 std::unique_ptr 使用 delete,但管理文件句柄、POSIX 信号量、OpenGL 纹理 ID 等非内存资源时,必须替换为对应释放逻辑。关键点在于:删除器类型是 std::unique_ptr 模板的一部分,不能靠运行时推导。

常见错误是写成 std::unique_ptr 然后试图用 lambda 赋值——编译直接失败,因为默认删除器是 std::default_delete,和 void(*)(FILE*) 不兼容。

  • 正确做法:把删除器类型作为第二个模板参数传入,例如 std::unique_ptr
  • 更安全写法:用 std::function 或自定义 struct,避免函数指针退化问题(尤其涉及重载或模板函数时)
  • 若删除器有状态(比如带日志前缀),必须用类类型,且该类需满足 MoveConstructible

用 lambda 做删除器时,必须捕获为空且显式指定类型

lambda 只有在不捕获任何变量时才是可默认构造的,才能作为 std::unique_ptr 的删除器类型。否则无法满足 unique_ptr 对删除器的移动/构造要求。

示例:管理一个手动分配的 POSIX 信号量

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

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中std::unique_ptr如何自定义删除器_C++智能指针管理非内存资源【经验】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4012378+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4012379+
  • 本周更新: 0+
  • 最后更新: 2026-03-16