Terminazione del programma C++

In C++, è possibile uscire da un programma in questi modi:

  • Chiamare la funzione exit.
  • Chiamare la funzione abort.
  • Eseguire un'istruzione return da main.

Funzione exit

La exit funzione, dichiarata in <stdlib.h>, termina un programma C++. Il valore fornito come argomento a exit viene restituito al sistema operativo come codice restituito o codice di uscita del programma. Per convenzione, un codice restituito uguale a zero indica che il programma è stato completato correttamente. È possibile usare le costanti EXIT_FAILURE e EXIT_SUCCESS, definite anche in <stdlib.h>, per indicare l'esito positivo o negativo del programma.

Funzione abort

La abort funzione, dichiarata anche nel file <di inclusione standard stdlib.h>, termina un programma C++. La differenza tra exit e abort è che exit consente l'elaborazione della terminazione del runtime C++ (vengono chiamati distruttori di oggetti globali). abort termina immediatamente il programma. La abort funzione ignora il normale processo di distruzione per gli oggetti statici globali inizializzati. Ignora inoltre qualsiasi elaborazione speciale specificata utilizzando la funzione atexit.

Specifico di Microsoft: per motivi di compatibilità di Windows, l'implementazione Microsoft di può consentire l'esecuzione del codice di abort terminazione dll in determinate circostanze. Per ulteriori informazioni, vedere abort.

Funzione atexit

Usare la atexit funzione per specificare le azioni eseguite prima che il programma termini. Nessun oggetto statico globale inizializzato prima che la chiamata a atexit venga eliminata definitivamente prima dell'esecuzione della funzione di elaborazione di uscita.

return istruzione in main

L'istruzione return consente di specificare un valore restituito da main. Un'istruzione return in main primo luogo agisce come qualsiasi altra return istruzione. Tutte le variabili automatiche vengono eliminate definitivamente. main Richiama quindi exit con il valore restituito come parametro. Si consideri l'esempio seguente:

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

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

Le exit istruzioni e return nell'esempio precedente hanno un comportamento simile. Entrambe terminano il programma e restituiscono un valore pari a 3 al sistema operativo. La differenza è che exit non elimina la variabile sautomatica , mentre l'istruzione return esegue .

In genere, C++ richiede che funzioni con tipi restituiti diversi da void restituire un valore. La main funzione è un'eccezione; può terminare senza un'istruzione return . In tal caso, restituisce un valore specifico dell'implementazione al processo di richiamo. Per impostazione predefinita, MSVC restituisce 0.

Distruzione di oggetti statici e thread

Quando si chiama exit direttamente (o quando viene chiamato dopo un'istruzione return da main), gli oggetti thread associati al thread corrente vengono eliminati definitivamente. Successivamente, gli oggetti statici vengono eliminati definitivamente nell'ordine inverso della loro inizializzazione (dopo le chiamate alle funzioni specificate in atexit, se presenti). Nell'esempio seguente viene mostrato come funziona un'inizializzazione e una pulizia di questo tipo.

Esempio

Nell'esempio seguente, gli oggetti sd1 statici e sd2 vengono creati e inizializzati prima della voce in main. Dopo che questo programma termina usando l'istruzione return , viene prima sd2 eliminato definitivamente e quindi sd1. Il distruttore della classe ShowData chiude i file associati a questi oggetti statici.

// 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" );
}

Un altro modo per scrivere questo codice consiste nel dichiarare gli ShowData oggetti con ambito di blocco, che li elimina in modo implicito quando escono dall'ambito:

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

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

Vedi anche

main argomenti della funzione e della riga di comando