문제

C++에서 전역 메모리가 초기화됩니까?그렇다면 어떻게?

(두 번째) 설명:

프로그램이 시작될 때 기본 요소가 초기화되기 전에 전역 메모리가 될 메모리 공간에는 무엇이 있습니까?예를 들어 그것이 0으로 되어 있는지, 아니면 쓰레기인지 이해하려고 노력 중입니다.

상황은 다음과 같습니다싱글톤 참조를 설정할 수 있습니까? instance() 초기화하기 전에 호출하세요.

MySingleton* MySingleton::_instance = NULL;

결과적으로 두 개의 싱글톤 인스턴스를 얻게 됩니까?

싱글톤의 여러 인스턴스에 대한 내 C++ 퀴즈를 참조하세요...

도움이 되었습니까?

해결책

예 전역 프리미티브는 NULL로 초기화됩니다.

예:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

힙의 클래스, 구조체, 배열, 메모리 블록에 대해서는 어떤 가정도 할 수 없습니다.

항상 모든 것을 초기화하는 것이 가장 안전합니다.

다른 팁

표준에서:

정적 저장 기간(3.7.1)이 있는 객체는 다른 초기화가 수행되기 전에 0으로 초기화(8.5)되어야 합니다.0 초기화와 상수식을 사용한 초기화를 총칭하여 호출합니다. 정적 초기화;다른 모든 초기화는 동적 초기화.상수 표현식(5.19)으로 초기화된 정적 저장 기간이 있는 POD[일반 기존 데이터] 유형(3.9)의 개체는 동적 초기화가 발생하기 전에 초기화되어야 합니다.동일한 번역 단위의 네임스페이스 범위에 정의된 정적 저장 기간이 있고 동적으로 초기화되는 개체는 해당 정의가 번역 단위에 나타나는 순서대로 초기화됩니다.[참고:8.5.1에서는 집계 멤버가 초기화되는 순서를 설명합니다.로컬 정적 물체의 초기화는 6.7에 설명되어 있습니다.

그렇습니다. 정적 저장 기간을 갖는 전역 변수가 초기화됩니다.예를 들어 힙에 할당된 전역은 물론 자동으로 초기화되지 않습니다.

임베디드 세계에서 나오다...

코드는 세 가지 유형의 메모리로 컴파일됩니다.
1..데이터:초기화된 메모리
2..텍스트:상수와 코드
삼..bss:초기화되지 않은 메모리(명시적으로 초기화되지 않은 경우 C++에서 0으로 초기화됨)

전역변수는 초기화된 경우 .data에 들어갑니다.그렇지 않은 경우 .bss에 배치되고 사전 기본 코드에서 0으로 지정됩니다.

정적/전역 범위로 선언된 변수는 항상 최소한 VC++에서 초기화됩니다.

어떤 상황에서는 실제로 다음 사이의 동작에 차이가 있을 수 있습니다.

int x = 0;

int main() { ... }

그리고

int x;

int main() { ... }

공유 데이터 세그먼트를 사용하는 경우 VC++는 최소한 명시적인 초기화와 함께 존재를 사용합니다. #pragma data_seg 특정 변수가 프로세스의 공유 데이터 세그먼트 또는 개인 데이터 세그먼트에 들어가야 하는지 결정합니다.

재미를 더하려면 공유 데이터 세그먼트에 생성자/소멸자가 선언된 정적 C++ 개체가 있는 경우 어떤 일이 발생하는지 생각해 보세요.생성자/소멸자는 exe/dll이 사용자가 원하는 것이 거의 확실하지 않은 데이터 세그먼트에 연결될 때마다 호출됩니다.

자세한 내용은 이 KB 문서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top