一、智能指针的核心基础
1. 核心作用
智能指针是 C++ 标准库(STL)提供的模板类,本质是对原生裸指针(raw pointer)的封装,核心解决 2 个致命问题:
- 手动管理动态内存时,忘记调用
delete/delete[]导致的内存泄漏; - 程序异常退出时,
delete语句执行不到导致的内存泄漏; - 规避原生指针的野指针、二次释放等问题。
2. 实现原理
所有智能指针的底层都基于 C++ 经典的 RAII 编程思想:
RAII(资源获取即初始化):在构造函数中申请/持有资源(这里是动态内存),在析构函数中释放资源。智能指针是栈上的对象,当栈对象生命周期结束(出作用域、异常退出),析构函数一定会被调用,内存就一定会被释放,无需手动管理。
3. 头文件
所有 C++ 标准智能指针,都定义在 <memory> 头文件中,使用前必须包含:
#include <memory>
二、C++ 所有标准智能指针(按重要性排序)
1. std::unique_ptr「独占型智能指针」—— 最常用、优先级最高
核心特性
unique_ptr 是独占所有权的智能指针:一块动态内存,永远只能被一个 unique_ptr 指向,不允许拷贝、不允许赋值。
- 它是 C++11 新增的,轻量级(无额外内存开销,和原生指针效率一致);
- 支持指向单个对象,也原生支持指向数组(
unique_ptr<int[]>); - 支持指定自定义删除器,用于释放特殊资源(比如文件句柄、网络句柄)。
关键规则
- ❌ 禁止拷贝:
unique_ptr<int> p2 = p1;编译报错; - ❌ 禁止赋值:
p2 = p1;编译报错; - ✅ 允许移动:通过
std::move()转移内存的所有权,转移后原指针变为空指针,新指针持有内存,这是唯一合法的'传递'方式。
常用示例
#include <memory>
#include <iostream>
using namespace std;
int main() {
// 方式 1:创建指向单个对象的 unique_ptr(推荐 make_unique,C++14 支持)
unique_ptr<int> p1 = make_unique<int>();
cout << *p1 << endl;
unique_ptr<[]> p2 = <[]>();
( i = ; i < ; ++i) p2[i] = i;
unique_ptr<> p3 = (p1);
cout << *p3 << endl;
(p1 == ) {
cout << << endl;
}
p();
;
}

