前言
在 C++ 的世界里,内存管理始终是开发者必须直面的核心挑战。指针赋予了直接操作内存的能力,但也埋下了内存泄漏、野指针、二次释放等隐患。幸运的是,C++11 标准库引入了智能指针,通过 RAII(资源获取即初始化)机制,将资源生命周期与对象生命周期绑定,实现了内存的自动管理。
本文将深入解析智能指针的设计原理与实战技巧,涵盖 unique_ptr、shared_ptr 和 weak_ptr 的核心用法,帮助你构建更安全、高效的代码。
一、裸指针的风险回顾
在使用智能指针之前,有必要理解裸指针带来的典型问题。
1.1 内存泄漏
内存泄漏指分配的内存未被正确释放。在复杂逻辑中,一旦遗漏 delete,内存便无法回收。
void func() {
int* p = new int(10);
if (some_condition) {
return; // 提前返回,忘记释放 p
}
delete p;
}
若函数中途返回,delete p 将不会执行。循环调用此类函数会导致内存持续增长直至崩溃。
1.2 二次释放
对同一块内存多次调用 delete 会破坏堆结构,导致未定义行为或崩溃。
void func() {
int* p = new int(20);
delete p;
// ... 逻辑处理 ...
delete p; // 重复释放
}
1.3 野指针
指向已释放或非法地址的指针称为野指针。访问它可能导致程序崩溃。
int* func() {
int x = 10;
return &x; // 返回栈内存地址
}
函数返回后栈帧销毁,返回的指针即刻失效。
1.4 异常安全
异常抛出会中断正常流程,若未妥善处理,可能导致资源泄露。
{
* p = ();
{
std::();
} (...) {
;
}
p;
}


