

新闻资讯
技术学院自定义 std::unique_ptr 的 deleter 是让指针释放时执行指定逻辑而非仅 delete;支持函数指针、lambda、functor 等可调用类型,需在模板参数中显式声明 deleter 类型。
自定义 std::unique_ptr 的 deleter,核心是让指针在释放资源时执行你指定的逻辑,不只是简单调用 delete。
deleter 可以是函数指针、函数对象(functor)、lambda 表达式,或任何可调用类型,只要它接受一个参数(指针类型)且无返回值。
void my_deleter(int* p)
必须在 unique_ptr 模板中声明 deleter 类型,否则编译失败:
auto del = [](int* p) {
std::cout << "Deleting: " << *p << "\n";
delete p;
};
std::unique_ptr ptr(new int(42), del);
注意:不能只写 std::unique_ptr 然后传 lambda 构造——类型不匹配。必须把 decltype(del) 显式作为第二个模板参数。
C++14 起没有直接支持自定义 deleter 的 make_unique,但可以
封装辅助函数:
templateauto make_unique_with_deleter(Deleter&& d) { return std::unique_ptr >( new T(), std::forward (d) ); } // 使用 auto ptr = make_unique_with_deleter ([](int* p) { delete p; });
这样就不需要反复写 decltype,也避免了类型推导错误。
fopen / fclose,用 std::unique_ptr
std::default_delete 替代默认的 delete(防止未定义行为)release() 或触发回调,实现“最后释放时才真正销毁”基本上就这些。关键不是“怎么写”,而是想清楚:资源谁分配、谁释放、释放时要做什么——deleter 就是你掌控释放环节的钩子。