2012-11-03 6 views
10

Z pewnością możliwe jest wykonanie kodu przed wywołaniem main, co widać na wielu przykładach w this question.Czy to dobrze określone zachowanie, aby wyjść z programu przed głównym?

Co jednak jeśli w tym głównym kodzie głównym program zostanie powiadomiony o wyjściu przez std::exit lub std::abort? Od main jest zdefiniowany jako początek programu, jakie są konsekwencje wyjścia z programu przed rozpoczęciem?

Przy drukowaniu coś w każdej sekcji, mam następujące wyniki:

Format:
Sekcja: output

główna: main
Init (zwany przed główny): init
Exit (utworzone z std::atexit wewnątrz Init): exiting



Przykładowe trasy:

Init wywołana bez wychodzenia:

Init
główne
zwraca 0

Init zwraca std :: exit (0):

startowych
zwraca 0

Init zwraca std: : przerwij:

startowych
awarii i zwraca 3 na Windows GCC 4.7.2
awarii i wywołuje zwykłe pudełko z VS11
zwraca 0 na LiveWorkSpace

Init ustawia obsługi i zwraca std :: exit (0):

init
exiting
zwraca 0

Init ustawia obsługi i zwraca std :: Abort:

startowych
sam interes jak bez obsługi

Podczas poszukiwania, widziałem to pytanie: Is there any way a C/C++ program can crash before main()?. Nie odpowiada jednak na to, co chcę wiedzieć: czy jedno z tych zachowań, wywołujące std::exit lub std::abort, jest dobrze zdefiniowane? Czy to nieokreślone zachowanie?

+0

Jeśli interesuje Cię próbka łącząca testy, [tutaj jest jeden] (http://liveworkspace.org/code/ff19b767d545e3c8a76671b1d21add00). – chris

Odpowiedz

7

Krótka odpowiedź brzmi: nie ma (prawie) żadnych konsekwencji. Niektóre destruktory mogą nie zostać wywołane, jeśli nieoczekiwanie zadzwonisz pod numer exit, ale to już prawie wszystko.
Generalnie, nie wywoływanie destruktorów nie jest najczystszym sposobem, ale potem wynik końcowy będzie taki sam.

Kiedy kończy proces (przez exit lub abort lub po prostu segfaulting lub innego powodu), uchwyty (obiekty jądra, plików, itp) są zamknięte, a pamięć związana z przestrzeni adresowej programu jest odzyskiwana przez operacyjnej system.

Nie ma w tym nic więcej, ponieważ po wywołaniu exit lub abort, zasadniczo prosisz o zakończenie programu (te funkcje nigdy nie wracają!), Więc naprawdę nie możesz oczekiwać, że coś się stanie później.

Należy pamiętać, że rejestrowanie funkcji takiej jak Init do wywoływania przed main jest niestandardowe, ale można uzyskać ten sam efekt przez zastosowanie konstruktora w środowisku globalnym.

+1

zapisy buforowane mogą nie zostać zapisane na 'wyjściu' z powodu nie wywoływania destruktorów. –

+2

@JanDvorak: Jeśli odwołasz się do "buforowanego", tak jak w buforowaniu standardowej biblioteki C lub C++ (iostream lub stdio), to tak. Ale znowu, to jest dokładnie to, o co prosisz, więc nie jest to zaskakujące. W końcu mówisz "to wszystko, idź dalej i zabij mnie teraz!". Buforowane zapisy, które zostały zaakceptowane przez system operacyjny, powinny (powinny) zakończyć się pomyślnie, chyba że system operacyjny jest poważnie uszkodzony. – Damon

Powiązane problemy