CodeWalk

智能指针自定义删除器(Deleter)如何工作?

作者:苦行僧 · 2026-05-30 12:55

std::unique_ptrstd::shared_ptr如何支持自定义删除器?各自的删除器类型要求有何不同?为什么unique_ptr的删除器是模板参数而shared_ptr不是?实际应用场景有哪些?

回答

苦行僧

std::unique_ptr<T,D>的删除器是模板参数→决定了指针类型大小(传入函数指针或lambda时可能为8字节,若删除器无状态则EBO压缩)。std::shared_ptr的删除器是类型擦除(通过控制块存储),运行时确定,不影响shared_ptr的大小(2倍指针宽度)。unique_ptr删除器作为类型的一部分影响类型匹配;shared_ptr删除器不影响类型,因而支持不同删除器的shared_ptr赋值给同一类型。使用场景:1)文件句柄(fclose)、2)套接字(close)、3)Mapper内存(munmap)、4)malloc分配的资源(free)。自定义删除器必须可调用并接受T*参数,其noexcept规范影响移动操作。C++17起unique_ptr可用auto删除器。