目录一、unique_ptr 的基本概念二、unique_ptr 核心原理独占式所有权三、unique_ptr 基础用法1. 基本创建与使用2. 所有权转移3. 管理数组四、unique_ptr 常见误区误区 1用 unique_ptr 管理栈内存误区 2尝试拷贝 unique_ptr六、总结一、unique_ptr 的基本概念unique_ptr作为 C11 标准引入的新一代智能指针是现代 C 内存管理中当之无愧的首选—— 它不仅是三者中最 “轻量”“高效” 的存在几乎能达到和裸指针持平的性能更从语法层面杜绝了裸指针最常见的内存泄漏、重复释放等问题堪称 “零成本的内存安全保障”。二、unique_ptr 核心原理独占式所有权通俗解释unique_ptr就像给堆内存上了“独占锁”同一时刻只有一个unique_ptr能指向这块内存底层支撑RAII 机制资源绑定对象生命周期析构时自动释放对比裸指针不用手动delete即使函数抛异常 / 提前返回内存也会自动释放。三、unique_ptr 基础用法1. 基本创建与使用#include iostream #include memory using namespace std; class Person { public: string name; int age; Person(string n, int a) : name(n), age(a) { cout name Person() endl; } ~Person() { cout name ~Person() endl; } void show() { cout name age 岁 endl; } }; int main() { // 方式1直接初始化不推荐有异常安全风险 unique_ptrPerson p1(new Person(张三, 20)); p1-show(); // 调用成员函数 // 方式2推荐make_uniqueC14更安全避免 “new 后抛异常导致智能指针未创建内存泄漏” auto p2 make_uniquePerson(李四, 25); p2-show(); return 0; // 出作用域p1/p2 自动析构内存释放 }2. 所有权转移int main() { auto p1 make_uniquePerson(王五, 30); cout p1 是否为空 (p1 nullptr) endl; // 0false // 所有权转移move 语义 unique_ptrPerson p2 std::move(p1); cout p1 是否为空 (p1 nullptr) endl; // 1true p2-show(); // 手动释放可选一般不需要 p2.reset(); // 释放内存p2 变为 nullptr cout p2 是否为空 (p2 nullptr) endl; // 1true return 0; }3. 管理数组int main() { // 管理int数组 unique_ptrint[] arr make_uniqueint[](4); for (int i 0; i 4; i) { arr[i] i 1; cout arr[i] ; // 输出1 2 3 4 } cout endl; // 管理自定义类数组 unique_ptrPerson[] p_arr make_uniquePerson[](2); p_arr[0] Person(赵六, 35); p_arr[1] Person(钱七, 40); p_arr[0].show(); return 0; // 自动释放数组无需 delete[] }四、unique_ptr 常见误区误区 1用unique_ptr管理栈内存Person p(张三, 20);unique_ptrPerson ptr(p); // 错误析构时 double free 崩溃误区 2尝试拷贝unique_ptrauto p1 make_uniquePerson(李四, 25);unique_ptrPerson p2 p1; // 编译错误禁止拷贝六、总结unique_ptr是 C 智能指针的 “首选”独占所有权杜绝重复释放和内存泄漏几乎零开销效率接近裸指针推荐用make_unique创建避免异常安全问题仅支持移动禁止拷贝符合 “独占” 设计初衷。
C++ —— unique_ptr 详解
目录一、unique_ptr 的基本概念二、unique_ptr 核心原理独占式所有权三、unique_ptr 基础用法1. 基本创建与使用2. 所有权转移3. 管理数组四、unique_ptr 常见误区误区 1用 unique_ptr 管理栈内存误区 2尝试拷贝 unique_ptr六、总结一、unique_ptr 的基本概念unique_ptr作为 C11 标准引入的新一代智能指针是现代 C 内存管理中当之无愧的首选—— 它不仅是三者中最 “轻量”“高效” 的存在几乎能达到和裸指针持平的性能更从语法层面杜绝了裸指针最常见的内存泄漏、重复释放等问题堪称 “零成本的内存安全保障”。二、unique_ptr 核心原理独占式所有权通俗解释unique_ptr就像给堆内存上了“独占锁”同一时刻只有一个unique_ptr能指向这块内存底层支撑RAII 机制资源绑定对象生命周期析构时自动释放对比裸指针不用手动delete即使函数抛异常 / 提前返回内存也会自动释放。三、unique_ptr 基础用法1. 基本创建与使用#include iostream #include memory using namespace std; class Person { public: string name; int age; Person(string n, int a) : name(n), age(a) { cout name Person() endl; } ~Person() { cout name ~Person() endl; } void show() { cout name age 岁 endl; } }; int main() { // 方式1直接初始化不推荐有异常安全风险 unique_ptrPerson p1(new Person(张三, 20)); p1-show(); // 调用成员函数 // 方式2推荐make_uniqueC14更安全避免 “new 后抛异常导致智能指针未创建内存泄漏” auto p2 make_uniquePerson(李四, 25); p2-show(); return 0; // 出作用域p1/p2 自动析构内存释放 }2. 所有权转移int main() { auto p1 make_uniquePerson(王五, 30); cout p1 是否为空 (p1 nullptr) endl; // 0false // 所有权转移move 语义 unique_ptrPerson p2 std::move(p1); cout p1 是否为空 (p1 nullptr) endl; // 1true p2-show(); // 手动释放可选一般不需要 p2.reset(); // 释放内存p2 变为 nullptr cout p2 是否为空 (p2 nullptr) endl; // 1true return 0; }3. 管理数组int main() { // 管理int数组 unique_ptrint[] arr make_uniqueint[](4); for (int i 0; i 4; i) { arr[i] i 1; cout arr[i] ; // 输出1 2 3 4 } cout endl; // 管理自定义类数组 unique_ptrPerson[] p_arr make_uniquePerson[](2); p_arr[0] Person(赵六, 35); p_arr[1] Person(钱七, 40); p_arr[0].show(); return 0; // 自动释放数组无需 delete[] }四、unique_ptr 常见误区误区 1用unique_ptr管理栈内存Person p(张三, 20);unique_ptrPerson ptr(p); // 错误析构时 double free 崩溃误区 2尝试拷贝unique_ptrauto p1 make_uniquePerson(李四, 25);unique_ptrPerson p2 p1; // 编译错误禁止拷贝六、总结unique_ptr是 C 智能指针的 “首选”独占所有权杜绝重复释放和内存泄漏几乎零开销效率接近裸指针推荐用make_unique创建避免异常安全问题仅支持移动禁止拷贝符合 “独占” 设计初衷。