2011-08-14 2 views
16

가능한 중복 :
Will exit() or an exception prevent an end-of-scope destructor from being called?exit()를 호출 할 때 소멸자가 실행됩니까?

C++에서

, 응용 프로그램이 종료 (3) 가정 스택에 소멸자가 스택 긴장을 풀고 실행되도록하는 호출?

+0

그리고 대체 방법이 있습니까? 'exit'를 호출하는 대신'main'에서 catch하고'main'에서'exit' 대신'main'을'return'하는 대신에 특별한 타입을'throw '합니까? –

+1

@AaronMcDaid 질문이 이해가 가지 않습니다. 무엇에 대한 대체 접근법? 'exit()'에 대한 호출을 피함으로써 무엇을 성취하려고합니까? 내 응용 프로그램 중 하나에서'customExit' 객체를 던져 main에서 catch하고'customExit' 객체의 정수 값을 사용하여 main에서 반환 값을 제공합니다. 이렇게하면 RAII 소멸자가 다음과 같이 정리됩니다. 임시 파일. – WilliamKF

+0

귀하의 의견에 정확하게 (나쁘게 작성된) 질문에 답변했습니다. 감사! 기본적으로 나는 다른 사람들이이'throw '접근법을 사용하여 정상적인 프로그램 출구에서 모든 것이 파괴되는지 확인하고자했다. –

답변

28

대부분의 소멸자는 exit()에서 실행되지 않습니다.

C++ 98 §18.3/8이 이에 대해 설명합니다.

exit 정적 개체를 호출 할 때 atexit 처리기가 실행되고 열린 C 스트림이 플러시되고 닫히고 tmpfile에서 생성 된 파일이 제거됩니다. 로컬 자동 개체는 파괴되지 않습니다. 즉, 스택 해체가 없습니다.

abort으로 전화하면 더 적은 일이 발생합니다. 아무런 정리가 없습니다.

+0

정리 작업을 원하지 않는 사용자의 경우 abort()가 SIGABRT 신호를 발생 시키므로 일반적으로 _exit()가 abort()보다 더 나은 호출 일 수 있습니다. 일반적으로 충돌과 유사한 결과가 발생합니다. –

5

OS가 합리적이라면 (예 : Unix, Linux 또는 최근 Windows) exit()를 호출하면 커널에 모든 프로세스의 메모리 할당을 해제합니다. 스택을 풀지 않아도됩니다. 그것은 단순히 사라질 것입니다.

+13

그리고 스택 소멸자의 RAII 코드는 호출되지 않을 것이다. 프로세스에 대한 개인적인 메모리 만 다루는 경우 중요하지 않을 수 있습니다. (a) 삭제되거나 이름이 바뀌거나 다른 방식으로 정리되어야하는 파일과 (b) 공유 메모리의 프로세스간에 공유되는 데이터 구조의 무결성을 다루는 경우 중요합니다. // 이러한 이유로 일부 프로젝트에서는 exit를 사용하지 못하도록하거나 exit()를 다시 정의하여 스택 되감기를 발생시키는 예외를 throw합니다. –

관련 문제