답변:
abort()
atexit()
먼저 사용하여 등록 된 함수를 호출 하지 않고 객체의 소멸자를 먼저 호출 하지 않고 프로그램을 종료합니다 . exit()
프로그램을 종료하기 전에 둘 다 수행합니다. 자동 객체에 대해서는 소멸자를 호출하지 않습니다. 그래서
A a;
void test() {
static A b;
A c;
exit(0);
}
소멸 a
되고 b
적절하지만의 소멸자를 호출하지 않습니다 c
. abort()
객체의 소멸자를 호출하지 않습니다. 불행히도 C ++ 표준은 적절한 종료를 보장하는 대체 메커니즘을 설명합니다.
자동 저장 기간이있는
main()
객체 는 함수 에 자동 객체가없고 호출을 실행 하는 프로그램에서 모두 파괴 됩니다exit()
. 에main()
잡힌 예외를 발생시켜 제어를 그러한에 직접 전송할 수 있습니다main()
.
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
을 호출하는 대신 exit()
해당 코드 throw exit_exception(exit_code);
를 정렬하십시오 .
중단 SIGABRT 신호를 전송, 출구는 단지 일반 정리 작업을 수행하는 응용 프로그램을 닫습니다.
원하는대로 중단 신호를 처리 할 수 있지만 기본 동작은 오류 코드와 함께 응용 프로그램을 닫는 것입니다.
중단 은 정적 및 전역 구성원의 오브젝트 삭제를 수행하지 않지만 종료 됩니다.
물론 응용 프로그램이 완전히 닫히면 운영 체제는 사용 가능한 메모리와 기타 리소스를 비 웁니다.
모두에서 중지 및 종료 프로그램 종료, 리턴 코드는 응용 프로그램을 시작 부모 프로세스로 돌아갑니다 (기본 동작을 재정의하지 않은 가정).
다음 예를 참조하십시오.
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
코멘트:
중단 이 주석 처리되지 않은 경우 : 아무것도 인쇄되지 않으며 어떤 오브젝트의 소멸자가 호출되지 않습니다.
위와 같이 abort 를 주석 처리 하면 someobject 소멸자가 호출되고 다음과 같은 결과가 나타납니다.
종료 기능 2
종료 기능 1
프로그램이 exit
()를 호출하면 다음과 같은 일이 발생합니다 .
atexit
기능이 실행됩니다tmpfile
이 제거됩니다.abort
() 함수는 전송 SIGABRT
이 프로그램이 열린 스트림 / 플러시 종료되었는지 또는 통해 생성 된 임시 파일 것이라는 보장은 종료된다 잡힌하지 않으면 현재 프로세스 신호를 tmpfile
제거는, atexit
등록 된 함수가 호출되지 않고, 비 종료 상태 0이 호스트로 리턴됩니다.
exit () 매뉴얼 페이지에서 :
exit () 함수는 정상적인 프로세스 종료를 유발하고 상태 값 & 0377이 상위로 리턴됩니다.
abort () 매뉴얼 페이지에서 :
abort ()는 먼저 SIGABRT 신호를 차단 해제 한 다음 호출 프로세스를 위해 해당 신호를 발생시킵니다. 이로 인해 SIGABRT 신호가 포착되고 신호 핸들러가 리턴되지 않으면 프로세스가 비정상적으로 종료됩니다.
abort
SIGABRT
신호를 보냅니다 . abort
발신자에게 돌아 오지 않습니다. SIGABRT
신호 의 기본 처리기 는 응용 프로그램을 닫습니다. stdio
파일 스트림이 플러시 된 다음 닫힙니다. 그러나 C ++ 클래스 인스턴스의 소멸자는 확실하지 않습니다 (이것에 대해서는 확실하지 않습니다-아마도 결과가 정의되지 않았습니까?).
exit
로 설정된 자체 콜백이 atexit
있습니다. 콜백이 지정되면 (또는 하나만) 등록 순서와 반대로 (스택과 같은) 순서로 호출되면 프로그램이 종료됩니다. 와 마찬가지로 abort
, exit
호출자에게 반환하지 않습니다. stdio
파일 스트림이 플러시 된 다음 닫힙니다. 또한 C ++ 클래스 인스턴스의 소멸자가 호출됩니다.