다음을 통해 공유


C++ 프로그램 종료

C++에서는 다음과 같은 방법으로 프로그램을 종료할 수 있습니다.

  • 함수를 호출합니다 exit .
  • 함수를 호출합니다 abort .
  • 에서 returnmain문을 실행합니다.

exit 함수

stdlib.h>에 <선언된 함수는 exit C++ 프로그램을 종료합니다. 인수 exit 로 제공된 값은 프로그램의 반환 코드 또는 종료 코드로 운영 체제에 반환됩니다. 규칙에 따라 반환 코드 0은 프로그램이 성공적으로 완료되었음을 의미합니다. 상수 EXIT_FAILUREEXIT_SUCCESSstdlib.h>에 <정의된 상수도 사용하여 프로그램의 성공 또는 실패를 나타낼 수 있습니다.

abort 함수

표준 include file <stdlib.h>에도 선언된 함수는 abort C++ 프로그램을 종료합니다. 차이점은 exitabort C++ 런타임 종료 처리가 수행될 수 있다는 exit 점입니다(전역 개체 소멸자가 호출됨). abort 는 프로그램을 즉시 종료합니다. 이 함수는 abort 초기화된 전역 정적 개체에 대한 일반 소멸 프로세스를 무시합니다. 또한 이 함수는 atexit 함수를 사용하여 지정된 모든 특수 처리를 건너뜁니다.

Microsoft 관련: Windows 호환성을 위해 Microsoft 구현 abort 을 통해 특정 상황에서 DLL 종료 코드를 실행할 수 있습니다. 자세한 내용은 abort를 참조하세요.

atexit 함수

함수를 atexit 사용하여 프로그램이 종료되기 전에 실행되는 작업을 지정합니다. 종료 처리 함수를 실행하기 전에 호출 atexit 이 제거되기 전에 초기화된 전역 정적 개체가 없습니다.

return statement in main

return 문을 사용하면 .에서 main반환 값을 지정할 수 있습니다. 첫 번째 문은 returnmain 다른 return 문처럼 작동합니다. 모든 자동 변수가 제거됩니다. 그런 다음 반환 main 값을 매개 변수로 호출합니다 exit . 다음 예제를 참조하세요.

// return_statement.cpp
#include <stdlib.h>
struct S 
{
    int value;
};
int main()
{
    S s{ 3 };

    exit( 3 );
    // or
    return 3;
}

exit 이전 예제의 and return 문은 비슷한 동작을 갖습니다. 둘 다 프로그램을 종료하고 3 값을 운영 체제에 반환합니다. 차이점은 exit 문이 자동 변수 sreturn 를 삭제하지 않는다는 점입니다.

일반적으로 C++에서는 값을 반환하지 않는 반환 형식 void 이 있는 함수가 필요합니다. 함수는 main 예외입니다. 문 없이 return 종료할 수 있습니다. 이 경우 호출 프로세스에 구현별 값을 반환합니다. (기본적으로 MSVC는 0을 반환합니다.)

스레드 및 정적 개체의 소멸

직접 호출 exit 하거나 문 main이후에 return 호출될 때 현재 스레드와 연결된 스레드 개체가 제거됩니다. 다음으로 정적 개체는 초기화의 역순으로 제거됩니다(지정된 함수(있는 경우)에 대한 atexit호출 후). 다음 예제에서는 이러한 초기화 및 정리가 작동하는 방법을 보여 줍니다.

예시

다음 예제에서는 정적 개체 sd1sd2 만들고 입력 main하기 전에 초기화합니다. 이 프로그램이 문을 사용하여 return 종료되면 먼저 sd2 제거된 다음 sd1. ShowData 클래스에 대한 소멸자가 이 정적 개체와 연결된 파일을 닫습니다.

// using_exit_or_return1.cpp
#include <stdio.h>
class ShowData {
public:
   // Constructor opens a file.
   ShowData( const char *szDev ) {
   errno_t err;
      err = fopen_s(&OutputDev, szDev, "w" );
   }

   // Destructor closes the file.
   ~ShowData() { fclose( OutputDev ); }

   // Disp function shows a string on the output device.
   void Disp( char *szData ) {
      fputs( szData, OutputDev );
   }
private:
   FILE *OutputDev;
};

//  Define a static object of type ShowData. The output device
//   selected is "CON" -- the standard output device.
ShowData sd1 = "CON";

//  Define another static object of type ShowData. The output
//   is directed to a file called "HELLO.DAT"
ShowData sd2 = "hello.dat";

int main() {
   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

이 코드를 작성하는 또 다른 방법은 블록 범위가 있는 개체를 ShowData 선언하는 것입니다. 이 개체는 범위를 벗어날 때 암시적으로 삭제됩니다.

int main() {
   ShowData sd1( "CON" ), sd2( "hello.dat" );

   sd1.Disp( "hello to default device\n" );
   sd2.Disp( "hello to file hello.dat\n" );
}

참고 항목

main 함수 및 명령줄 인수