2011-08-28 4 views
2

C++에서 전역 객체의 생성자를 어떤 순서로 가져 오나요?글로벌 생성자가 어떤 순서로 호출되는지

이 질문은 일부 소비자의 메모리 요구를 관리하는 메모리 풀의 컨텍스트에서 발생합니다. 글로벌 네임 스페이스에서 힙 함수를 사용하는 일부 소비자를 정의하는 다소 큰 소스 코드가 제공되었습니다. 소비자의 네임 스페이스를 변경하지 않고 메모리 풀을 추가해야합니다. 따라서 전역 클래스 네임 스페이스에 풀 클래스와 정의를 추가하고 각 소비자 클래스를 수정하여 클래스 "thePool"인스턴스에서 메모리를 가져 왔습니다. 불행히도 집행이 끝날 때 모든 글로벌 소멸자를 호출 할 때 나는 좋은 segfault를 얻는다. gdb 백 트레이스는 pool :: free에 대한 브랜치가 segfault를 생성 함을 보여줍니다. 나는 이상하게 들린다. 그러나, 나는 그것을 글로벌 네임 스페이스에있는 아주 간단한 풀/소비자 예제로 끓여 버렸습니다. 불행하게도 이것은 segfault를 재생산하지 않습니다 - 풀의 소멸자는 소비자의 모든 소멸자 후에 호출됩니다. 이것은 순수한 행운입니까, 아니면 잘 교육받은 g ++ 4.5의 추측입니까? 여기 졸인 예

:

#include<iostream> 

using namespace std; 


struct pool { 
    pool() { 
    cout << "pool::pool" << endl; 
    } 
    ~pool() { 
    cout << "pool::~pool" << endl; 
    } 
    void get() { 
    cout << "pool::get" << endl; 
    } 
    void free() { 
    cout << "pool::free" << endl; 
    } 
}; 

pool thePool; 


struct consumer { 
    ~consumer() { 
    cout << "consumer::~consumer" << endl; 
    thePool.free(); 
    } 
    consumer() { 
    cout << "consumer::consumer" << endl; 
    thePool.get(); 
    } 
}; 



consumer a,b; 

int main() { 
} 

출력은 :

pool::pool 
consumer::consumer 
pool::get 
consumer::consumer 
pool::get 
consumer::~consumer 
pool::free 
consumer::~consumer 
pool::free 
pool::~pool 

니스! 내가 원했던대로. 순수한 운? 나는 풀의 dtor가 소비자 a 또는 b를 파기하기 전에 호출되었을 수 있음을 의미합니까?

"글로벌 개체의 단점은 어떤 순서로 호출됩니까?"라는 질문에 대한 대답은 다음과 같습니다.

+0

진짜 질문입니까. 또는 더 관련성있는 질문입니다 : "사용하기 전에 내 전역 (정적 저장 기간 개체)이 완전히 초기화되었는지 어떻게 알 수 있습니까?" –

+0

질문은 이런 식으로 의도되었습니다. 나는 Singletons와 같은 메커니즘을 요구하지 않았습니다. 감사! – ritter

+0

전역 변수보다 나은 방법이 있습니다. 함수 내에 정적 저장 기간 객체를 가질 수 있습니다 (참조를 반환 할 수 있음). 첫 번째 호출에서 생성되고 올바른 순서로 소멸됩니다. 따라서 당신이 그것을 사용할 때 그것은 ** 보장 된 ** 제대로 만들어집니다. –

답변

7

전역 변수는 선언 된 순서대로 초기화됩니다. 따라서 생성자는 초기화되는 순서와 동일한 순서로 호출됩니다. 이는 하나의 translation unit에 해당합니다. 그러나 여러 번역 단위의 초기화 순서는 언어 사양에 의해 정의되지 않습니다.

그리고 소멸자는 평소와 같이 초기화의 역순으로 호출됩니다.

+0

좋습니다. 합리적인 것처럼 보입니다. 소멸자는? 정의 된 순서와 정확히 일치합니까? – ritter

+0

"오래된"C++ 2003 standart가 그것에 대해 말한 것을 찾으려고 노력했지만, 전역 범위에서 정적 저장 기간을 가진 객체에 대한 ctors, dtors의 실행 순서에 대해서는 아무 것도 찾을 수 없습니다 – bruziuz

4

번역 단위간에 정의되지 않지만 선언 순서는 다릅니다.

관련 문제