前言
在 C++ 开发中,内存管理始终是核心挑战之一。指针赋予了直接操作内存的能力,但也带来了内存泄漏、野指针、重复释放等风险。C++11 引入的智能指针通过 RAII(资源获取即初始化)机制,将资源生命周期与对象生命周期绑定,实现了内存的自动回收。
本文将深入解析 unique_ptr、shared_ptr 和 weak_ptr 的设计原理与实战用法,帮助你在保证安全的前提下提升代码质量。
一、裸指针的风险
在使用智能指针之前,有必要回顾一下裸指针(Raw Pointer)常见的陷阱。
1.1 内存泄漏
当分配的堆内存未被正确释放时,就会发生内存泄漏。这在复杂逻辑或异常路径中尤为常见。
void func() {
int* p = new int(10);
if (some_condition) {
return; // 提前返回,p 未释放
}
delete p;
}
若 some_condition 为真,函数提前返回,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;
}



