가능한 중복 :
C++에서
Will exit() or an exception prevent an end-of-scope destructor from being called?exit()를 호출 할 때 소멸자가 실행됩니까?
, 응용 프로그램이 종료 (3) 가정 스택에 소멸자가 스택 긴장을 풀고 실행되도록하는 호출?
가능한 중복 :
C++에서
Will exit() or an exception prevent an end-of-scope destructor from being called?exit()를 호출 할 때 소멸자가 실행됩니까?
, 응용 프로그램이 종료 (3) 가정 스택에 소멸자가 스택 긴장을 풀고 실행되도록하는 호출?
대부분의 소멸자는 exit()
에서 실행되지 않습니다.
C++ 98 §18.3/8이 이에 대해 설명합니다.
exit
정적 개체를 호출 할 때 atexit
처리기가 실행되고 열린 C 스트림이 플러시되고 닫히고 tmpfile
에서 생성 된 파일이 제거됩니다. 로컬 자동 개체는 파괴되지 않습니다. 즉, 스택 해체가 없습니다.
abort
으로 전화하면 더 적은 일이 발생합니다. 아무런 정리가 없습니다.
정리 작업을 원하지 않는 사용자의 경우 abort()가 SIGABRT 신호를 발생 시키므로 일반적으로 _exit()가 abort()보다 더 나은 호출 일 수 있습니다. 일반적으로 충돌과 유사한 결과가 발생합니다. –
OS가 합리적이라면 (예 : Unix, Linux 또는 최근 Windows) exit()를 호출하면 커널에 모든 프로세스의 메모리 할당을 해제합니다. 스택을 풀지 않아도됩니다. 그것은 단순히 사라질 것입니다.
그리고 스택 소멸자의 RAII 코드는 호출되지 않을 것이다. 프로세스에 대한 개인적인 메모리 만 다루는 경우 중요하지 않을 수 있습니다. (a) 삭제되거나 이름이 바뀌거나 다른 방식으로 정리되어야하는 파일과 (b) 공유 메모리의 프로세스간에 공유되는 데이터 구조의 무결성을 다루는 경우 중요합니다. // 이러한 이유로 일부 프로젝트에서는 exit를 사용하지 못하도록하거나 exit()를 다시 정의하여 스택 되감기를 발생시키는 예외를 throw합니다. –
그리고 대체 방법이 있습니까? 'exit'를 호출하는 대신'main'에서 catch하고'main'에서'exit' 대신'main'을'return'하는 대신에 특별한 타입을'throw '합니까? –
@AaronMcDaid 질문이 이해가 가지 않습니다. 무엇에 대한 대체 접근법? 'exit()'에 대한 호출을 피함으로써 무엇을 성취하려고합니까? 내 응용 프로그램 중 하나에서'customExit' 객체를 던져 main에서 catch하고'customExit' 객체의 정수 값을 사용하여 main에서 반환 값을 제공합니다. 이렇게하면 RAII 소멸자가 다음과 같이 정리됩니다. 임시 파일. – WilliamKF
귀하의 의견에 정확하게 (나쁘게 작성된) 질문에 답변했습니다. 감사! 기본적으로 나는 다른 사람들이이'throw '접근법을 사용하여 정상적인 프로그램 출구에서 모든 것이 파괴되는지 확인하고자했다. –