独占指针的创建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
相关推荐
郝学胜_神的一滴15 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境4 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境4 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴5 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境7 天前
C++ 的Eigen 库全解析
c++
卷无止境7 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴7 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake