Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W języku C++możesz zamknąć program na następujące sposoby:
Funkcja exit
Funkcja exit zadeklarowana w <pliku stdlib.h> kończy program C++. Wartość podana jako argument jest exit zwracana do systemu operacyjnego jako kod powrotny programu lub kod zakończenia. Zgodnie z konwencją kod zwrotny zero oznacza, że program zakończył się pomyślnie. Możesz użyć stałych EXIT_FAILURE i EXIT_SUCCESS, również zdefiniowanych w <pliku stdlib.h>, aby wskazać powodzenie lub niepowodzenie programu.
Funkcja abort
Funkcja abort , zadeklarowana również w standardzie include file <stdlib.h>, kończy program C++. Różnica między elementami exit i abort umożliwia exit wykonywanie przetwarzania kończenia czasu wykonywania języka C++ (wywoływane są globalne destruktory obiektów).
abort natychmiast kończy program. Funkcja abort pomija normalny proces niszczenia dla zainicjowanych globalnych obiektów statycznych. Pomija również wszelkie specjalne przetwarzanie określone przy użyciu atexit funkcji .
Specyficzne dla firmy Microsoft: Ze względów zgodności systemu Windows implementacja abort firmy Microsoft może umożliwić uruchamianie kodu zakończenia biblioteki DLL w pewnych okolicznościach. Aby uzyskać więcej informacji, zobacz abort.
Funkcja atexit
atexit Użyj funkcji , aby określić akcje wykonywane przed zakończeniem programu. Nie zainicjowano globalnych obiektów statycznych przed zniszczeniem wywołania atexit przed wykonaniem funkcji przetwarzania zakończenia.
return instrukcja w main
Instrukcja return umożliwia określenie wartości zwracanej z main. Instrukcja w return pierwszej kolejności działa jak każda main inna return instrukcja. Wszystkie zmienne automatyczne są niszczone.
main Następnie wywołuje exit wartość zwracaną jako parametr. Rozważmy następujący przykład:
// return_statement.cpp
#include <stdlib.h>
struct S
{
int value;
};
int main()
{
S s{ 3 };
exit( 3 );
// or
return 3;
}
Instrukcje exit i return w poprzednim przykładzie mają podobne zachowanie. Zarówno przerwanie programu, jak i zwrócenie wartości 3 do systemu operacyjnego. Różnica polega na tym, że exit nie niszczy zmiennej automatycznej s, podczas gdy return instrukcja to robi.
Zwykle język C++ wymaga, aby funkcje, które mają zwracane typy inne niż void zwracać wartość. Funkcja main jest wyjątkiem; może kończyć się bez instrukcji return . W takim przypadku zwraca wartość specyficzną dla implementacji do procesu wywoływania. (Domyślnie funkcja MSVC zwraca wartość 0).
Niszczenie wątków i obiektów statycznych
Po wywołaniu exit bezpośrednio (lub po wywołaniu instrukcji return z main), obiekty wątku skojarzone z bieżącym wątkiem zostaną zniszczone. Następnie obiekty statyczne są niszczone w odwrotnej kolejności ich inicjowania (po wywołaniach funkcji określonych do atexit, jeśli istnieją). W poniższym przykładzie pokazano, jak działa takie inicjowanie i oczyszczanie.
Przykład
W poniższym przykładzie obiekty statyczne sd1 i sd2 są tworzone i inicjowane przed wpisem do main. Po zakończeniu korzystania z instrukcji return program najpierw sd2 zostanie zniszczony, a następnie sd1. Destruktor klasy ShowData zamyka pliki skojarzone z tymi obiektami statycznymi.
// 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" );
}
Innym sposobem na napisanie tego kodu jest zadeklarowanie ShowData obiektów z zakresem bloku, które niejawnie niszczy je, gdy wyjdą poza zakres:
int main() {
ShowData sd1( "CON" ), sd2( "hello.dat" );
sd1.Disp( "hello to default device\n" );
sd2.Disp( "hello to file hello.dat\n" );
}