从裸指针到智能指针:C++内存管理的演进
手动管理内存是C++的精髓,也是噩梦。高效率的代价是极高的心智负担——一旦忘了 delete,或者异常打断了释放路径,内存就漏了。下面这个例子很典型:
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;
}
try-catch 块不仅让函数体臃肿不堪,而且一旦忘记捕获某个异常或者资源种类再多一些,崩溃只是时间问题。智能指针就是为了消灭这种手动释放的重复劳动,顺便解决异常安全问题。
RAII:用对象生命周期管资源
RAII(Resource Acquisition Is Initialization)不是什么魔法,就是一个设计习惯:把资源(内存、文件句柄、锁)绑定到对象的构造/析构上,获取在构造,释放在析构。C++ 保证离开作用域时析构函数一定被调用,即使因为异常提前退栈。用它管理内存,代码立刻清爽很多:


