惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
I
InfoQ
A
About on SuperTechFans
GbyAI
GbyAI
宝玉的分享
宝玉的分享
爱范儿
爱范儿
博客园 - 【当耐特】
博客园 - 司徒正美
博客园 - 聂微东
P
Proofpoint News Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
B
Blog RSS Feed
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
博客园 - 叶小钗

博客园 - double64

C# 字符串转换 C# 遍历删除空文件夹 MFC 单文档无边框最大化全屏 MFC 单文档去掉菜单栏 MFC 对话框去边框最大化全屏 C++ 动态数组 C++ 安全的拷贝赋值(Copy-and-Swap 惯用法) C++ 基类派生类的 static_cast 和 dynamic_cast 转换的简单测试 visual studio 的 snippet 代码片段模板样式 Windows 右键管理官方小程序Autoruns C++ 结合 enum 按位与或组合检测枚举项 两个用来写 CLI - Command-Line Interface 的命令解析库 enum class 类型转换 int 微软输入法中如何输出当前时间 音程知识 C++ 模板引用参数的各种情况 英语 12 种时态 Qt 手动添加 Q_OBJECT 需要添加的地方 C# WPF 绑定 ObservableObject 实现 INotifyPropertyChanged 接口 C++ 标准库 copy_if C++ lambda 和 bind 何时优先使用 Windows 下的 Qt 中 min max 函数冲突 C++ RVO 或 NRVO 可能触发的条件 C++ std::unique_ptr 和 std::shared_ptr 都支持自定义删除器(deleter) C++ 智能指针和动态数组 std::vector 插入另一个 vector 的范围元素 Qt tableWidget QTableWidget 常用一些属性设置 C++ 内部类(嵌套类)是可以访问外部类的私有保护成员的 C++ 宏展开顺序 C++ std::round() 四舍五入
std::unique_ptr 当删除器类型为 无状态的时构造可以不用传删...
double64 · 2026-05-13 · via 博客园 - double64

当删除器类型 DelIntVar 是无状态的(没有成员变量、没有虚函数)时,std::unique_ptr 会使用空基类优化(EBO),不需要在构造时传入删除器实例。

// 空基类
struct DelIntVar
{
    void operator()(int *var) const
    {
        std::cout << "自定义删除器工作..." << '\n';
        delete var;
    }

    // 没有成员变量 → 无状态
};


int main()
{
    DelIntVar delObj;
    {
        std::unique_ptr<int, DelIntVar> myInt(new int(100));   // 这里可以不用传 删除器对象。相当于默认构造
        std::cout << *myInt << std::endl;

        std::unique_ptr<int, DelIntVar> myInt2(new int(200), delObj);  // 可以传对象,相当于拷贝构造
        std::cout << *myInt2 << std::endl;

        std::unique_ptr<int, DelIntVar> myInt3(new int(300));
        std::cout << *myInt2 << std::endl;
    }

    getchar();
    return 0;
}

输出:

100
200
200
自定义删除器工作...
自定义删除器工作...
自定义删除器工作...