独占指针的创建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。
相关推荐
octopus_c37 分钟前
C++ 模板详解:函数模板、类模板、特化与分离编译
开发语言·c++·算法
東隅已逝,桑榆非晚43 分钟前
算法1. 双指针法-移动零
c++·算法
悠仁さん2 小时前
【C++】set map 使用
java·前端·c++
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatServer问题修复
c++·学习·ai·大模型·sdk
扶尔魔ocy3 小时前
【QT C++】常用设计模式
c++·设计模式
晚风予卿云月3 小时前
【C++高并发内存池】 2.ThreadCache设计
开发语言·c++·高并发内存池·tcmalloc
東隅已逝,桑榆非晚4 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
艾莉丝努力练剑4 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk
D e re k ZH5 小时前
C++ 模板与泛型编程进阶(No 2)
开发语言·c++
青少儿编程课堂5 小时前
蓝桥杯青少组图形化+信息素养+电子学会Scratch考级:校园口算闯关解析
c++·python·算法·bfs·信息学竞赛