C++ 如果在初始化静态局部变量之前发生异常,会发生什么情况?
静态局部变量何时初始化? 如果在构造函数中抛出异常,是否认为该对象已构造?会调用析构函数吗 以休闲代码为例:C++ 如果在初始化静态局部变量之前发生异常,会发生什么情况?,c++,c++11,exception,static-initialization,C++,C++11,Exception,Static Initialization,静态局部变量何时初始化? 如果在构造函数中抛出异常,是否认为该对象已构造?会调用析构函数吗 以休闲代码为例: #include <iostream> #include <exception> int x = 0; class A { public: A() { std::cout << 'a'; if (x++ == 0) { throw std::exception(); } } ~A() { std::c
#include <iostream>
#include <exception>
int x = 0;
class A {
public:
A() {
std::cout << 'a';
if (x++ == 0) {
throw std::exception();
}
}
~A() { std::cout << 'A'; }
};
class B {
public:
B() { std::cout << 'b'; }
~B() { std::cout << 'B'; }
A a;
};
void foo() { static B b; }
int main() {
try {
foo();
}
catch (std::exception &) {
std::cout << 'c';
foo();
}
}
#包括
#包括
int x=0;
甲级{
公众:
(){
std::cout每次控制传递变量定义时,都会尝试初始化具有静态存储持续时间的块作用域变量,直到成功
从[stmt.dcl]/4:
使用静态存储持续时间(3.7.1)或线程存储动态初始化块作用域变量
持续时间(3.7.2)在控制第一次通过其声明时执行;考虑此类变量
初始化完成后初始化。如果初始化通过抛出异常退出,则
初始化未完成,因此下次控件输入声明时将再次尝试初始化。
如果一个类型为B
的对象的构造引发异常,那么它的构造当然不能完成。并且按照静态变量的销毁顺序,它不会有任何影响?@Adib:我不明白-对什么有影响?静态变量的销毁顺序与它们的构造顺序相反(当然,这只有在实际发生构造时才相关)。是的,我确实想知道这一点,因为静态变量在异常之前没有构造,所以它不会改变破坏顺序。对吗?@Adib:只有对象被破坏。如果没有对象,就没有什么可破坏的。