一、裸指针的常见问题
在深入智能指针之前,我们先回顾一下**裸指针(Raw Pointer)**的痛点。正是这些风险,催生了智能指针的诞生。
1.1 内存泄漏
内存泄漏是指程序分配的内存空间在使用完毕后,没有被正确释放,导致这部分内存永远无法被再次使用。
// 反面示例:裸指针导致的内存泄漏
void func() {
int* p = new int(10);
// 业务逻辑处理...
if (some_condition) {
return; // 提前返回,忘记释放 p
}
delete p;
}
在上述代码中,如果 some_condition 为 true,函数会提前返回,delete p 语句就永远不会执行,导致堆内存泄漏。
1.2 二次释放
二次释放是指对同一块内存进行多次 delete 操作。这会破坏堆内存的完整性,导致程序崩溃或未定义行为。
// 反面示例:裸指针导致的二次释放
void func() {
int* p = new int(20);
delete p; // 第一次释放
// ... 中间经过复杂的逻辑,忘记 p 已经被释放
delete p; // 第二次释放,程序崩溃
}
1.3 野指针
野指针是指指向已释放内存或非法内存地址的指针。访问野指针会导致程序崩溃、数据损坏等不可预测的结果。
// 反面示例:裸指针导致的野指针问题
int* func() {
int x = 10;
return &x; // 返回栈内存地址,形成野指针
}
1.4 异常安全
当程序发生异常时,正常的执行流程会被打断,可能导致裸指针无法被释放。


