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를 파기하기 전에 호출되었을 수 있음을 의미합니까?
"글로벌 개체의 단점은 어떤 순서로 호출됩니까?"라는 질문에 대한 대답은 다음과 같습니다.
진짜 질문입니까. 또는 더 관련성있는 질문입니다 : "사용하기 전에 내 전역 (정적 저장 기간 개체)이 완전히 초기화되었는지 어떻게 알 수 있습니까?" –
질문은 이런 식으로 의도되었습니다. 나는 Singletons와 같은 메커니즘을 요구하지 않았습니다. 감사! – ritter
전역 변수보다 나은 방법이 있습니다. 함수 내에 정적 저장 기간 객체를 가질 수 있습니다 (참조를 반환 할 수 있음). 첫 번째 호출에서 생성되고 올바른 순서로 소멸됩니다. 따라서 당신이 그것을 사용할 때 그것은 ** 보장 된 ** 제대로 만들어집니다. –