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++免费学习笔记(深入)”;