unique_ptr是C++11引入的独占式智能指针,通过move语义转移所有权,离开作用域时自动释放内存,支持make_unique创建、自定义删除器、数组管理及作为函数参数返回值使用,避免内存泄漏且零开销。

unique_ptr 是 C++11 引入的智能指针,用于自动管理动态分配的对象生命周期。它通过独占所有权机制确保同一时间只有一个 unique_ptr 指向某个对象,当指针离开作用域时,自动调用 delete 释放内存,防止内存泄漏。
1. 基本用法:创建和初始化 unique_ptr
使用 std::make_unique(C++14 起推荐)或直接构造来创建 unique_ptr。
#include#include iostream>
示例:
std::unique_ptrstd::unique_ptr<:string> ptr2 = std::make_unique<:string>("Hello");
也可以用原始指针构造(不推荐直接使用 new):
立即学习“C++免费学习笔记(深入)”;
std::unique_ptr2. 独占所有权:不能复制,只能移动
unique_ptr 不支持拷贝构造和赋值,只能通过 move 语义转移所有权。
错误示例(编译失败):
auto ptr = std::make_uniqueauto ptr2 = ptr; // 错误:不能复制
正确方式(使用 std::move):
auto ptr2 = std::move(ptr); // 所有权转移,ptr 变为 nullptr转移后原指针为空,不能再访问:
if (!ptr) {std::cout }
3. 访问和操作所管理的对象
提供两种常用操作符:
- *ptr:解引用获取对象值
- ptr->:调用对象成员函数
示例:
class MyClass {public:
void say() { std::cout };
auto obj = std::make_unique
obj->say(); // 调用成员函数
*obj = MyClass(); // 赋新值
4. 自定义删除器(Deleter)
某些场景需要自定义资源释放逻辑,比如关闭文件、释放数组等。
GNU makefile中文手册 pdf,文比较完整的讲述GNU make工具,涵盖GNU make的用法、语法。同时重点讨论如何为一个工程编写Makefile。阅读本书之前,读者应该对GNU的工具链和Linux的一些常用编程工具有一定的了解。诸如:gcc、as、ar、ld、yacc等本文比较完整的讲述GNU make工具,涵盖GNU make的用法、语法。重点讨论如何使用make来管理软件工程、以及如何为工程编写正确的Makefile。 本手册不是一个纯粹的语言翻译版本,其中对GNU make的一些语法
示例:管理数组
std::unique_ptrarr[0] = 1; // 使用 [] 访问元素
自定义删除器示例:
auto deleter = [](FILE* f) {if (f) fclose(f);
};
std::unique_ptr
文件在 unique_ptr 析构时自动关闭。
5. 作为函数参数和返回值
传递 unique_ptr 通常使用 move 或以引用形式避免所有权转移。
函数接收:
void func(std::unique_ptrstd::cout } // ptr 在此释放
调用时需 move:
auto p = std::make_uniquefunc(std::move(p));
函数返回 unique_ptr(常见于工厂模式):
std::unique_ptrreturn std::make_unique
}
6. 与 raw pointer 交互
必要时可获取原始指针,但要小心使用:
int* raw = ptr.get(); // 获取裸指针,不转移所有权重置或释放资源:
ptr.reset(); // 释放对象,ptr 变为 nullptrptr.reset(new int(5)); // 替换管理的新对象
auto released = ptr.release(); // 返回裸指针,ptr 变空,需手动 delete
基本上就这些。unique_ptr 设计简洁高效,几乎零开销,是管理单个堆对象的首选智能指针。掌握它的移动语义和生命周期控制,能显著提升代码安全性和可维护性。









