C++如何使用std::unique_ptr管理资源?(所有权模型)

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

C++如何使用std::unique_ptr管理资源?(所有权模型)-第1张图片-佛山资讯网

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:

标签: ai c++ 隐式转换

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~