一、智能指针的使用场景分析
C++ 作为高效编程语言,其手动内存管理(new/delete)避免了高级语言垃圾回收的开销,但这也对程序员提出了更高要求。手动管理极易出现内存泄漏,特别是在异常处理场景中。
例如,在函数中连续分配资源时,若中间发生异常,后续的 delete 语句将无法执行,导致已分配的资源无法释放。虽然可以通过 try-catch 捕获异常并手动清理,但这会使代码变得极其臃肿且容易遗漏。智能指针通过 RAII 机制将资源生命周期绑定到对象作用域,能自动处理此类问题。
double Divide(int a, int b) {
if (b == 0) throw "Divide by zero condition!";
return (double)a / (double)b;
}
void Func() {
// 如果发生除 0 错误抛出异常,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,资源获取即初始化)是一种利用对象生命周期来管理动态资源的设计思想。资源可以是内存、文件句柄、网络连接等。在对象构造时获取资源,析构时释放资源。无论函数是正常返回还是因异常退出栈帧,析构函数都会被调用,从而保证资源被正确释放。
智能指针类除了满足 RAII 设计思路,还需像迭代器一样重载运算符(如 、),以便方便地访问底层资源。


