1
정적 로컬 변수는 언제 초기화됩니까? 생성자에서 예외가 발생하면 해당 객체가 생성 된 것으로 간주됩니까? 소멸자가 호출 될까요?정적 로컬 변수가 초기화되기 전에 예외가 발생하면 어떻게됩니까?
#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();
}
}
출력 :
가 fallowing 코드 고려 acabBA
처음 foo는()가 호출을, B는 초기화 시도됩니다. 생성자가 호출되며, 먼저 모든 멤버 변수가 생성됩니다. 이것은 A :: A()가 호출되어 a를 인쇄한다는 것을 의미합니다. A :: A()가 예외를 throw하면 생성자가 중단되고 b 또는 B :: a가 실제로 생성 된 것으로 간주되지 않습니다.
왜 b가 처음 초기화되지 않았습니까?
그리고 정적 변수의 파괴 순서대로 영향을 미치지 않을까요? – Adib
@Adib : 이해가 안됩니다 - 효과가 무엇인가요? 정적 변수는 구조의 역순으로 파괴됩니다 (물론 이것은 구조가 실제로 생성 된 경우에만 관련이 있습니다). –
네, 정확히 저는 정적 varible이 예외가 발생하기 전에 생성되지 않았다는 것을 알고 싶었습니다. 권리 ? – Adib