为什么需要智能指针?
在传统的 C++ 开发中,我们习惯用 new 和 delete 手动管理堆内存。但这很容易出问题。
void riskyFunction() {
MyClass* ptr = new MyClass();
// ... 业务逻辑 ...
if (some_condition) {
throw std::runtime_error("Oops!");
// 如果这里抛出异常,下面的 delete ptr 不会被执行!
}
delete ptr;
}
如果在 delete 之前因为条件判断、异常或者疏忽提前返回,指针指向的内存就永远无法释放,导致内存泄漏。这就是引入智能指针的根本原因。
核心思想:RAII
资源获取即初始化(Resource Acquisition Is Initialization)。原理其实很简单却极其强大:
- 构造函数中获取资源(分配内存、打开文件、加锁)。
- 析构函数中释放资源(释放内存、关闭文件、解锁)。
C++ 保证当一个对象离开作用域时(无论是正常退出还是因异常),它的析构函数一定会被自动调用。智能指针正是将 RAII 思想应用于动态内存管理的完美范例,它将裸指针包装成类对象,并在析构时自动执行 delete。
主要智能指针类型
C++11 引入了三种主要的智能指针,位于 <memory> 头文件中。
1. unique_ptr:独占所有权
这是最基础的智能指针,特性非常明确:
- 独占所有权:一个资源只能被一个
unique_ptr拥有。 - 禁止拷贝:不能拷贝构造,也不能拷贝赋值。
- 支持移动:可以通过
std::move转移所有权。 - 零开销:与裸指针相比几乎没有性能损失。
创建时推荐使用工厂函数 make_unique(C++14 引入):
#include <memory>
#include <iostream>
int main() {
// 方式 1:直接构造(不推荐)
std::unique_ptr<> ;
p2 = std::<>();
p3 = std::<std::string>();
std::cout << *p2 << std::endl;
;
}


