引言
在 C++ 的世界里,内存管理始终是开发者绕不开的一道坎。指针赋予了直接操作内存的能力,但也埋下了泄漏、野指针、重复释放等隐患。你是否曾因一个忘记释放的 new 调试了许久?是否被野指针导致的崩溃困扰过?幸运的是,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;
}
1.2 二次释放
对同一块内存多次调用 delete,会破坏堆完整性,引发未定义行为。
// 反面示例:二次释放
int* p = new int(20);
delete p;
delete p; // 崩溃
1.3 野指针
指向已释放或非法地址的指针。访问它会导致程序崩溃或数据损坏。
// 反面示例:野指针
int* func() {
int x = 10;
return &x; // 函数返回后栈内存失效
}
1.4 异常安全
异常发生时,正常流程中断,可能导致资源无法释放。
// 反面示例:异常导致泄漏
void {
* p = ();
();
p;
}



