Terminazione del programma C++
In C++, è possibile uscire da un programma in questi modi:
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 s
automatica , 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per