2012-11-03 3 views
10

this question의 많은 예제에서 볼 수 있듯이 main이 호출되기 전에 코드를 실행할 수 있습니다.main보다 먼저 프로그램을 종료하는 것이 잘 정의 된 동작입니까?

그러나 사전 주 코드에서 프로그램이 std::exit 또는 std::abort을 통해 종료하라는 메시지가 표시되면 어떻게됩니까? main은 프로그램의 시작으로 정의되었으므로 시작하기 전에 종료하면 어떤 결과가 발생합니까? 각 섹션에서 뭔가를 인쇄하면

, 나는 다음과 같은 결과를 얻을 :

형식 :
: output

홈페이지 : main
초기화 (전에 호출 주) :(초기화 내부 std::atexit로 설정)
종료 : exiting



샘플 실행은 :

초기화가 종료하지 않고 전화 :

초기화를

초기화
0을 반환

초기화는 표준 전화 :명 주요
0을 반환

초기화 (0) 표준 : 출구를 호출 : 중단 :

초기화
충돌 및 GCC 4.7과 Windows에서 3을 반환합니다.2
충돌과는 LiveWorkSpace에
0을 반환 VS11와 일반적인 상자가 나타납니다

초기화 핸들러를 설정하고 표준 : : 종료 (0) 전화 :

을 초기화
종료
반환 0

초기화가 핸들러를 설정하고 호출 표준 : 중단 :

초기화
검색하는 동안, 나는이 질문을보고

핸들러없이 같은 같은 거래 : Is there any way a C/C++ program can crash before main()?. 그러나 그것은 내가 알고 자하는 것에 대답하지 않습니다 : std::exit 또는 std::abortmain 앞에 잘 정의 된이 동작이 있습니까? 이 정의되지 않은 동작이 있습니까?

+0

테스트를 결합한 샘플에 관심이 있으시면 [여기에 있습니다] (http://liveworkspace.org/code/ff19b767d545e3c8a76671b1d21add00). – chris

답변

7

짧은 대답은 : (거의) 아무런 결과가 없다는 것입니다. 예기치 않게 exit을 호출하면 일부 소멸자가 호출되지 않을 수도 있지만 그게 사실입니다.
일반적으로 소멸자를 호출하지 않는 것이 가능한 가장 깨끗한 방법은 아니지만 다시 최종 결과가 동일합니다.

프로세스가 종료 될 때 (exit 또는 abort 또는 단순히 segfaulting 또는 다른 이유로) 핸들 (커널 개체, 파일 등)이 닫히고 프로그램의 주소 공간과 관련된 메모리가 작동 중 회수됩니다 체계.

exit 또는 abort으로 전화를 걸면 기본적으로 프로그램이 종료된다는 요청 (이 함수는 결코 돌아 오지 않습니다!) 때문에 이후에는 아무 것도 기대할 수 없기 때문에 그다지 많지 않습니다.

main 전에 호출 될 Init과 같은 함수를 등록하는 것은 표준이 아닌 항목이지만 전역에 생성자가 있으면 동일한 효과를 얻을 수 있습니다.

+1

소멸자가 호출되지 않기 때문에 버퍼링 된 쓰기가 'exit'에 기록되지 않을 수 있습니다. –

+2

@JanDvorak : C 또는 C++ 표준 라이브러리 (iostream 또는 stdio)에 버퍼링 된 것처럼 "버퍼링 된"을 참조하면 yes입니다. 그러나 다시 말하지만, 이것은 정확히 당신이 요구하는 것이기 때문에 놀라운 것이 아닙니다. 결국, 당신은 "그게 다야, 가서 지금 날 죽여!"라고 말하고있는 것입니다. 운영 체제가 심각하게 손상되지 않는 한, 운영 체제에서 허용 한 버퍼링 된 쓰기가 성공적으로 완료됩니다. – Damon