请考虑以下代码:
#include <iostream>
using namespace std;
class Test {
static int count;
int id;
public:
Test() {
count++;
id = count;
cout << "Constructing object number " << id << endl;
if(id == 4)
throw 4;
}
~Test() { cout << "Destructing object number " << id << endl; }
};
int Test::count = 0;
int main() {
try {
Test array[5];
} catch(int i) {
cout << "Caught " << i << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下输出:
Constructing object number 1
Constructing object number 2
Constructing object number 3
Constructing object number 4
Destructing object number 3
Destructing object number 2
Destructing object number 1
Caught 4
Run Code Online (Sandbox Code Playgroud)
我认为当对象超出范围时,总是会调用析构函数,即使抛出异常也是如此.Test在这种情况下,为什么没有一个实例的析构函数被调用?
您正在创建一个5 Test对象数组,但在创建3 完整对象后抛出异常,在该4对象的构造函数中抛出异常.在4到达构造函数的右括号之前,该对象的构造是不完整的.
堆栈解开要求那些析构函数3在创建它们以相反的顺序完全构造的对象,由于4次和5第对象从未构造的析构函数为它们不会被调用.
异常规则是:
抛出异常后,将调用该范围内所有完全创建的对象的析构函数.
完全创建的对象是其构造函数被干净地调用而没有任何异常的对象.
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |