#include <iostream>
#include <string>
struct Y {
Y() { std::cout << "Y()\n";}
~Y() { std::cout << "~Y()\n";}
};
struct S {
S() {
y1 = new Y{};
throw 3;
}
~S() { std::cout << "~\n";}
Y *y1;
};
int main() {
try {
S s;
} catch (...) {}
}
输出
Y()
Y
的析构函数从没被调用,因为在(任何)构造函数结束前,对象没有被构造完成,所以析构函数不会被调用
任何包括这种
struct S {
S() = default;
S(int) : S() {} // 即使S(int)中抛出异常也是安全的,因为S()结束了
};