独占指针的创建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
相关推荐
kyle~1 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz2 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
八解毒剂2 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
起床困难户5752 小时前
条款20:协助完成返回值优化
c++
啦啦啦啦啦zzzz2 小时前
算法总结(二分查找、双指针)
c++·算法
不负岁月无痕4 小时前
C++ 模板核心内容与高频面试题汇总
java·开发语言·c++
无限进步_4 小时前
从零实现一个迷你Shell——深入理解Linux命令行解释器
linux·运维·服务器·开发语言·c++·chrome
fpcc5 小时前
工具使用——CMake中的函数和宏
c++·cmake
乐观勇敢坚强的老彭5 小时前
C++信息学奥赛lesson1
java·开发语言·c++