静的ローカル変数はいつ初期化されますか? コンストラクタで例外がスローされた場合、そのオブジェクトは構築されていると見なされますか?デストラクタは呼ばれますか?静的ローカル変数が初期化される前に例外が発生した場合はどうなりますか?
休閑コードを検討:
#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();
}
}
出力:acabBA
初めてのfoo()が呼び出され、Bは初期化しようとしています。そのコンストラクタが呼び出され、最初にすべてのメンバ変数が構築されます。これは、A :: A()が呼び出され、aを出力することを意味します。 A :: A()は例外をスローし、コンストラクタは中断され、bまたはB :: aのどちらも実際に構築されているとはみなされません。
なぜ初めてbが初期化されなかったのですか?
と静的変数の破壊の順序では何の影響もありませんか? – Adib
@Adib:わかりません - 何が効果?静的変数は、構築の逆の順序で破棄されます(もちろん、実際に構築が行われた場合にのみ関連します)。 –
はい、私はこれを知りたかったのですが、静的変数は例外の前に構築されていなかったので、破壊の順序は変わりませんでした。右 ? – Adib