1. 智能指针的使用场景分析
下面程序中我们可以看到,new 了以后,我们也 delete 了,但是因为抛异常导致后面的 delete 没有得到执行,所以就内存泄漏了。因此我们需要 new 以后捕获异常,捕获到异常后 delete 内存,再把异常抛出。但 new 本身也可能抛异常,连续的两个 new 和下面的 Divide 都可能会抛异常,让处理变得很麻烦。智能指针放到这样的场景里就让问题简单多了。
double Divide(int a, int b) { // 当 b == 0 时抛出异常
if (b == 0) {
throw "Divide by zero condition!";
} else {
return (double)a / (double)b;
}
}
void Func() {
// 这里可以看到如果发生除 0 错误抛出异常,另外下面的 array 和 array2 没有得到释放。
// 所以这里捕获异常后并不处理异常,异常还是交给外面处理,这里捕获了再重新抛出去。
// 但是如果 array2 new 的时候抛异常呢,就还需要套一层捕获释放逻辑,这里更好解决方案
// 是智能指针,否则代码太繁琐了
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; // 异常重新抛出,捕获到什么抛出什么
}
cout << << array1 << endl;
[] array1;
cout << << array2 << endl;
[] array2;
}
{
{
();
} ( * errmsg) {
cout << errmsg << endl;
} ( exception& e) {
cout << e.() << endl;
} (...) {
cout << << endl;
}
;
}


