引言
在 C++ 的世界里,内存管理始终是开发者必须直面的核心挑战。指针赋予了直接操作内存的能力,但也埋下了泄漏、野指针和重复释放的隐患。幸运的是,C++11 引入的智能指针提供了自动化的解决方案,通过 RAII(资源获取即初始化)机制,让内存管理变得安全且省心。
一、裸指针的潜在风险
在深入智能指针之前,回顾裸指针(Raw Pointer)的痛点有助于理解其必要性。
1.1 内存泄漏
内存泄漏指分配的内存未正确释放,导致无法复用。尤其在复杂逻辑中,一个疏忽就可能造成泄漏。
// 反面示例:裸指针导致的内存泄漏
void func() {
int* p = new int(10);
// 业务逻辑处理...
if (some_condition) {
return; // 提前返回,忘记释放 p
}
delete p; // 正常路径下的释放,但异常路径会跳过
}
int main() {
while (true) {
func();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
若 some_condition 为真,函数提前返回,delete p 不会执行。循环调用会导致内存持续增长直至崩溃。
1.2 二次释放
对同一块内存多次 delete 会破坏堆完整性,引发未定义行为。
// 反面示例:裸指针导致的二次释放
void func() {
int* p = new int(20);
delete p; // 第一次释放
// ... 中间经过复杂的逻辑,忘记 p 已经被释放
p;
}



