一、何为智能指针
(1)传统指针的缺陷
传统指针的问题
- 内存泄漏(忘记 delete)
- 悬垂指针(delete 后继续访问)
- 异常安全问题(抛出异常后,后面的 delete 语句没办法执行)
因此,为了解决上述问题,就出现了RAII 和智能指针的思路
RAII:
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C++ 特有的核心编程范式,由 C++ 之父 Bjarne Stroustrup 提出,核心思想是将资源的生命周期完全绑定到对象的生命周期—— 通过对象的构造函数获取资源,析构函数释放资源,利用 C++ 自动调用析构函数的特性,确保资源(内存、文件句柄、锁、网络连接等)被及时、安全释放,从根本上避免资源泄漏。
简而言之就是
获取资源与构造绑定
释放资源与析构绑定
智能指针:
而智能指针就是在继承了 RAII 的基础上,让这个对象同时拥有普通指针的功能
二、智能指针的使用
(1)C++ 标准库的智能指针
1. std::unique_ptr(独占型智能指针)
- 核心特性:独占所有权,同一时间只能有一个
unique_ptr指向同一块内存,不支持拷贝(copy),仅支持移动(move)。 - 适用场景:管理独占资源(如单个对象、数组),是最常用的智能指针
示例
#include <iostream>
#include <memory>
class Test {
public:
Test(int id) : id_(id) { std::cout << "Test " << id_ << " 构造\n"; }
~Test() { std::cout << "Test " << id_ << " 析构\n"; }
void show() { std::cout << "Test id: " << id_ << "\n"; }
private:
int id_;
};
{
;
ptr1->();
ptr2 = std::<Test>();
std::unique_ptr<Test> ptr3 = std::(ptr2);
(!ptr2) std::cout << ;
;
arr_ptr[].();
ptr();
;
}




