2010-08-01 4 views
0

나는 다음과 같은 코드가 있습니다C++ 정적 멤버

void Foo() { 

    static std::vector<int>(3); 

    // Vector object is constructed every function call 

    // The destructor of the static vector is invoked at 
    // this point (the debugger shows so) 
    // <------------------- 

    int a; 
} 

그럼 어딘가에는 벡터 오브젝트는 모든 Foo() 전화에 건설됩니다 않는 이유는 일련의

Foo 여러 번 전화를 왜이다 소멸자가 static ... 선언 직후에 호출 되었습니까?


업데이트 :이 기능을 구현하기 위해 노력했다

번 메커니즘을 호출하고 내가 생각하는 CallOnce이 클래스 이름이 아주 좋은 것입니다

static core::CallOnce(parameters) 같은 것을 쓰고.

제 생각에는 static core::CallOnce call_once(parameters)이 더 나빠 보이지만 괜찮습니다. 이걸로는 아무 것도 할 수 없습니다.

감사합니다.

답변

12

귀하의 변수가 이름이 필요합니다 : 당신은이

+4

왜 이것이 순간적으로 다운 voted됩니까? –

+0

@ 마이클 : 좋은 질문입니다. 누구든지 위선적 인 코멘트를 남기지 않고 하향 투표를 계속해야합니다! 그것은 그들이 무엇을위한 것입니까! (오, +1) –

+0

@ 제임스 기회가 있는지 아십니까? 왜 이런 일이 발생합니까? 생성자에서 일부 작업을하는 이름없는 객체를 "일반"정적 변수로 만들지 않고 생성 된 객체를 파괴하지 않는 이유는 무엇입니까? –

7

, 그것의 끝 부분에만 생명이 존재하는 표현입니다. 디버거는 구조와 동일한 줄에 파괴를 표시 할 수 없으므로 다음 줄에 표시합니다.

항목에 이름을 지정하고 보통 static 의미가 적용됩니다.

+0

+1 또한 * 정답입니다. –

4

std::vector<int>(3)는 이름이 일시적를 만들기 때문에 만든 것 후 어떤 변수를 가리키는없이 즉시 파괴 그래서, 벡터에 이름을 지정하는 것을 잊었다

static std::vector<int> my_static_vector(3); 
+0

Lol - 모두가 한꺼번에 쌓이지는 않습니다. –