2016-11-26 8 views
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가 처음 초기화되지 않았습니까?

답변

3

정적 저장소 지속 기간을 가진 블록 범위 변수의 초기화는 제어가 성공할 때까지 변수 정의를 넘어갈 때마다 시도됩니다. [stmt.dcl]에서

/4

정적 저장 기간 (3.7.1) 또는 스레드 저장 기간 (3.7.2)와, 블록 범위 변수

동적 초기화가 먼저 수행된다

시간 제어는 선언을 통과합니다. 이러한 변수는 초기화가 완료되면 으로 초기화됩니다. 예외를 throw하여 초기화가 끝나면 초기화가 완료되지 않았으므로 다음에 컨트롤이 선언에 들어가면 다시 시도됩니다.

회원의 건설이 예외가 발생하면 완료되지 물론 유형 B 캔의 개체의 건설.

+0

그리고 정적 변수의 파괴 순서대로 영향을 미치지 않을까요? – Adib

+0

@Adib : 이해가 안됩니다 - 효과가 무엇인가요? 정적 변수는 구조의 역순으로 파괴됩니다 (물론 이것은 구조가 실제로 생성 된 경우에만 관련이 있습니다). –

+0

네, 정확히 저는 정적 varible이 예외가 발생하기 전에 생성되지 않았다는 것을 알고 싶었습니다. 권리 ? – Adib