2010-02-12 8 views
1

rLog와 코드 기반을 통합하기 위해 노력하고 있습니다. 리눅스에없는 Windows에서 문제가 발생했습니다. 헤더 파일에서 내가 나에게 "자세한"로깅 채널 (하나 기본적으로 디버그에서 최대)를 제공하는 정적 변수를 가지고 thusly 히 정의 :new는 윈도우에서 정적 전역 변수를 초기화 할 때 NULL을 반환합니까?

static RLogChannel *rlog_verbose = DEF_CHANNEL("verbose", Log_Debug); 

가 리눅스에이 아무 문제 없지만 Windows에서 나는 얻을 응용 프로그램이 시작 되 자마자 오류가 발생합니다.

나는 RLOG 라이브러리에이 라인을 아래로 추적 한

:

RLogChannel *rlog::GetComponentChannel(const char *component, const char* path, LogLevel levl) { 
... 
if(!gRootChannel) 
    gRootChannel = new RLogChannel("", level); 
... 
} 

문제는 새로운 호출이 체크 하고 때 프로그램이 신속하게 충돌을가는 NULL 포인터를 반환하는 것입니다 액세스되었습니다. Windows에서 전역 컨텍스트에 메모리를 할당하는 것과 관련된 규칙이 있습니까?

편집 : 저는 이것이 정적 객체의 초기화 순서와 관련된 것이 분명하다고 확신합니다. 나는 분명히 뭔가를 잃어 버리지 않았 음을 확신하고 싶었다 : Windows에서의 메모리 할당. 모두에게 감사드립니다!

+2

'new'은 null을 반환 할 수 없습니다. 예외가 발생 했습니까? – GManNickG

+1

코드가 실제로 실행되었는지 또는 gRootChannel이 다른 곳의 NULL인지 확인 했습니까? – Fionn

+0

두 코드 간의 연결은 무엇입니까? 첫 번째 변수 이름은'rlog_verbose'이며, 두 번째 변수 이름은'gRootChannel'입니다. 연결이 뭐야? 있어요? – AnT

답변

4

확실한 반환 null입니까? 그것은 전체 정적 initializer 일 수도 있습니다. 정적 이니 저 호출의 순서는 파일마다 정의되어 있지 않습니다. rlog_verbose를 사용하는 정적 코드가있는 경우 초기화 프로그램이 아직 호출되지 않았으므로 gRootCHannel이 NULL 일 수 있습니다.

1

new NULL을 반환하지 않습니다. 실패하면 std::bad_alloc 예외가 발생합니다. 정적 인 데이터 초기화가 실제로 엔트리 포인트 CRT 함수에서 실제로 호출되어 나중에 main()을 호출하는 경우에도 발생합니다.

new이 호출 된 적이 없기 때문에보고있는 NULL이 이미있을 수 있습니다. 실제로 호출 된 것을 확인하려면 정적 초기화에 중단 점을 놓고 발생 시점을 간단히 볼 수 있습니다.

+0

매우 알아두면 좋겠지 만, 이것은 정적 초기화 문제 일 것이라고 생각합니다. 아주 작은 창 경험이 있기 때문에 확실한 것이 빠져 있지 않은지 확인하고 싶었습니다. –

0

new은 null을 반환하지 않습니다. 따라서 정적 이니셜 라이저가 실행되기 전에 rlog_verbose을 사용하고 있어야합니다. 정적 이니셜 라이저가 이 아닌 실행 중일 수 있습니다.

디버거를 시작하고 정적 이니셜 라이저를 설정하고 main에 중단 점을 설정하고 충돌하는 코드 줄에서 현재 상황을 확인해야합니다. 당신이 충돌을 극복한다면 그것은 효과가 있습니까? main 전에 충돌이 발생 했습니까?

관련 문제