独占指针的创建std::make_unique 本身自带堆出现

一、std::make_unique 完整创建流程拆解

cpp

运行

复制代码
auto task = std::make_unique<AudioTask>();

1. 底层动作分步

  1. 堆内存分配 在堆上开辟一块足够存放 AudioTask 结构体大小的内存;
  2. 就地构造对象 调用 AudioTask无参默认构造函数,初始化堆里的实例;
  3. 生成 std::unique_ptr<AudioTask> 独占智能指针对象 这个智能指针存放在当前函数栈 (局部变量 task);
  4. 绑定所有权 task唯一拥有释放权限 的持有者,任何时候只有它能负责 delete 这块堆内存。

2. 等价裸指针对照(帮你看透底层)

cpp

运行

复制代码
// make_unique 等价手写裸指针版本
AudioTask* raw = new AudioTask();
std::unique_ptr<AudioTask> task(raw);

区别:

  • make_unique 更安全:不会出现 new 成功、unique_ptr 构造抛异常导致内存泄漏的边界问题;
  • 代码更简洁,不用重复写类型 AudioTask

3. 带参数构造的扩展写法

如果你的 AudioTask 有自定义构造函数:

cpp

运行

复制代码
struct AudioTask {
    AudioTask(AudioTaskType t) : type(t) {}
    AudioTaskType type;
    std::vector<int16_t> pcm;
};

// 传参构造,参数直接转发给类构造函数
auto task = std::make_unique<AudioTask>(kAudioTaskTypeEncodeToSendQueue);

二、auto 类型推导

auto task 最终推导出来的真实类型:

cpp

运行

复制代码
std::unique_ptr<AudioTask> task = std::make_unique<AudioTask>();

auto 自动匹配返回值类型,不用手写一长串模板。

三、创建后所有权关键特性

  1. 禁止拷贝 unique_ptr 删除了拷贝构造 / 拷贝赋值,下面代码直接编译报错:

cpp

运行

复制代码
auto task2 = task; // 错误!独占指针不能复制,会破坏唯一所有权
  1. 只允许移动转移所有权 只能用 std::move 移交掌控权,移交后原指针变空:

cpp

运行

复制代码
audio_encode_queue_.push_back(std::move(task));
// 此时 task == nullptr,不再持有堆对象
// 队列里的unique_ptr成为新唯一持有者

四、RAII 自动销毁逻辑

局部变量 task 是栈上对象:

  1. 正常函数结束、代码块闭合 → task 栈变量自动析构;
  2. unique_ptr 析构函数内部自动执行 delete,释放堆上 AudioTask
  3. AudioTask 内部成员 std::vector<int16_t> pcm 会跟着结构体析构,同步释放 PCM 采样的堆缓冲区;全程无内存泄漏,不用手动 delete

五、对比另一种创建方式(不推荐)

cpp

运行

复制代码
// 不推荐写法,风险更高
std::unique_ptr<AudioTask> task(new AudioTask());
  • 功能一致,但异常安全弱于 make_unique;工程标准写法一律优先 std::make_unique
相关推荐
MC皮蛋侠客14 分钟前
TDengine C++ 系列(5):C/C++ 连接器——连接管理与查询 API
c语言·c++·tdengine
MC皮蛋侠客18 分钟前
TDengine C++ 系列(8):流式计算与最新值缓存——库内实时处理
c++·缓存·tdengine
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧8 小时前
C++学习:基础知识的掌握
c++·visualstudio
C++ 老炮儿的技术栈14 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
new_zhou15 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
水饺编程16 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh16 小时前
类和对象~
开发语言·c++
程序喵大人16 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
豆沙沙包?16 小时前
c++中引用(P7-P11)
java·c++·算法
wuminyu17 小时前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++