std::unique_ptr是C++11引入的独占式智能指针,具有唯一所有权、禁止拷贝、仅支持移动、RAII自动释放等核心特性,推荐用make_unique创建,支持自定义删除器、数组特化及安全的所有权转移。

std::unique_ptr 是 C++11 引入的独占式智能指针,核心特点是“唯一所有权”——同一时间只能有一个 unique_ptr 指向某块资源,禁止拷贝,只支持移动。它通过 RAII 自动释放资源,是管理动态内存最安全、最轻量的方式之一。
创建与初始化
不能用裸指针直接赋值,必须显式构造或使用 make_unique(推荐):
-
推荐方式:std::unique_ptr
p = std::make_unique —— 异常安全,一步完成内存分配和对象构造(42); - 手动构造:std::unique_ptr
p(new int(42)); —— 不推荐,若 new 成功但构造函数抛异常,会内存泄漏 - 空指针:std::unique_ptr
p; 或 std::unique_ptr p{nullptr}; - 自定义删除器:std::unique_ptr
fp(fopen("a.txt", "r"), &fclose);
所有权转移(移动语义)
unique_ptr 禁止拷贝,但可安全转移所有权:
- 用 std::move 显式移交:auto p2 = std::move(p1); —— 此后 p1 变为空,p2 持有原资源
- 函数传参/返回时自动触发移动:传入 unique_ptr&& 参数,或直接 return 一个局部 unique_ptr
- 容器中存储:std::vector<:unique_ptr>> vec; vec.push_back(std::make_unique
(100)); —— push_back 接收右值,自动移动
访问与释放
像普通指针一样使用,但不支持隐式转换为 raw pointer:
立即学习“C++免费学习笔记(深入)”;
- 解引用:*p、p->member
- 获取原始指针:p.get() —— 仅用于观察或传给 C API,不移交所有权
- 释放控制权:p.release() —— 返回 raw pointer,unique_ptr 变为空,后续需手动 delete
- 重置资源:p.reset(new int(99)); 或 p.reset(); —— 先释放旧资源,再接管新资源(或清空)
数组支持与注意事项
默认 unique_ptr
- std::unique_ptr
arr = std::make_unique (10); —— 自动调用 delete[] - 不能用 arr[0] 以外的方式访问(如 arr.get()[5] 可行,但 arr.get()+1 不安全)
- 不能混用:std::unique_ptr
指向 new int[5] 是未定义行为 - 自定义删除器要匹配:std::unique_ptr
arr(ptr, [](int* p){ delete[] p; });
基本上就这些。unique_ptr 的所有权模型简单明确:谁持有,谁负责;转移靠 move;不共享,不复制。用对了,内存几乎不会出问题。










