std::unique_ptr是c++++11引入的智能指针,用于实现独占式所有权的资源管理。其核心用途是确保某个资源只能被一个指针拥有,并在离开作用域时自动释放,避免内存泄漏;“独占式”意味着资源不能被复制,但可以通过移动语义转移所有权;创建方式包括使用new直接初始化、推荐的std::make_unique以及管理数组类型的带[]删除器形式;访问资源可通过*和->操作符进行;所有权转移通过std::move实现,转移后原指针为空;常见注意事项包括不要手动delete资源、可安全放入容器中使用、支持自定义删除器以管理非内存资源。

std::unique_ptr 是 C++11 引入的一种智能指针,用来管理动态分配的对象,它的核心用途是实现独占式所有权的资源管理。说白了,就是确保某个资源(通常是堆内存)只能被一个指针拥有,并在它不再需要时自动释放,避免内存泄漏。
什么是“独占式”?
“独占式”意味着 std::unique_ptr 所指向的对象不能被复制给另一个 unique_ptr。也就是说,你不能写这样的代码:
std::unique_ptrp1(new int(5)); std::unique_ptr p2 = p1; // 编译错误!
这和 std::shared_ptr 不一样,后者允许多个指针共享同一个对象的所有权。而 unique_ptr 的设计目的就是为了更明确地表达:这个资源只能有一个主人,谁离开作用域谁就负责释放。
立即学习“C++免费学习笔记(深入)”;
怎么创建和使用 std::unique_ptr?
常见的用法其实很简单,一般有以下几种方式:
-
使用
new直接初始化:std::unique_ptr
ptr(new int(10)); -
使用
std::make_unique(推荐):auto ptr = std::make_unique
(10); 这种方式更安全,也更简洁,推荐优先使用。
-
管理数组类型(注意要用带 [] 的删除器):
Python开发网站指南 WORD版下载本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
auto arr = std::make_unique
(5); // 创建长度为5的int数组
访问内部对象也很简单,就像普通指针一样用 * 和 -> 操作符:
auto user = std::make_unique("Alice"); std::cout << user->getName() << std::endl;
如何转移所有权?
虽然 unique_ptr 不支持拷贝,但可以移动(move)。比如你可以把它作为函数返回值或者参数传递出去:
std::unique_ptrcreateInt() { return std::make_unique (42); } void useInt(std::unique_ptr ptr) { std::cout << *ptr << std::endl; }
调用方式如下:
auto p = createInt(); // 所有权从函数内转移到p useInt(std::move(p)); // 转移后,p变成空指针
注意:一旦移动之后,原来的指针就不再拥有资源了,相当于 null。
常见注意事项
不要手动 delete:用了
unique_ptr就不需要也不应该手动调用delete。配合容器使用没问题:可以把
unique_ptr放进std::vector或std::map中,只要不涉及拷贝操作就行。-
自定义删除器(高级用法):如果你管理的不是普通 new 出来的内存,比如文件句柄、socket 等资源,可以通过模板指定自定义删除逻辑。
struct MyDeleter { void operator()(FILE* fp) const { fclose(fp); } }; std::unique_ptrfp(fopen("file.txt", "r"));
基本上就这些。理解起来不难,但确实很容易因为习惯写法而出错,特别是刚从裸指针转过来的时候。用多了你会发现,std::unique_ptr 不仅能帮你省去手动管理内存的麻烦,还能让代码结构更清晰。









