独占指针的创建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
相关推荐
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_1998868710 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
2401_8390805411 小时前
C++常见八股
数据结构·c++·算法
qq_1998868712 小时前
第6板块 第2节 CUDA运行时API与驱动API 核心笔记
c++·人工智能·gpu算力
syagain_zsx13 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791313 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
S_WEAN13 小时前
C++STL - string类的模拟实现
c++
S_WEAN14 小时前
【C++】STL - string类
c++
码匠许师傅14 小时前
【C++三方组件】toml++:人性化的配置文件格式
c++