C++ 智能指针:使用场景、实现原理与内存泄漏防治
一、智能指针的使用场景分析
C++ 以高效著称,手动内存管理(new/delete)避免了高级语言垃圾回收的开销,但这把双刃剑对程序员要求极高。手动管理极易导致内存泄漏,尤其是在异常处理场景中。
例如,在函数中连续分配资源时,若中间发生异常,后续的 delete 可能无法执行,导致资源泄露。如果为了捕获异常而嵌套 try-catch 块,代码会变得极其臃肿且难以维护。智能指针的出现正是为了解决这类问题,通过对象生命周期自动管理资源。
double Divide(int a, int b) {
if (b == 0) throw "Divide by zero condition!";
else return (double)a / (double)b;
}
void Func() {
// 原始方案:若 Divide 抛出异常,array1 和 array2 未释放
int* array1 = new int[10];
int* array2 = new int[10];
try {
int len, time;
cin >> len >> time;
cout << Divide(len, time) << endl;
} catch (...) {
cout << "delete []" << array1 << endl;
cout << "delete []" << array2 << endl;
delete[] array1;
delete[] array2;
throw; // 重新抛出异常
}
// ... 后续逻辑
delete[] array1;
delete[] array2;
}
二、RAII 和智能指针的设计思路
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种利用对象生命周期管理资源的类设计思想。资源(内存、文件句柄、锁等)在构造时获取,在析构时释放。无论函数正常返回还是因异常退出栈帧,析构函数都会被调用,从而保证资源释放。


