2013-11-26 11 views
7

Ich bin Schnittstelle C-Programm (main() ist in C) mit C++. An einigen Stellen in meinem Code möchte ich die Ausführung des Programms stoppen. Jetzt würde ich gerne wissen, wie kann ich das sauber machen?So beenden Sie ein Programm mit gemischten C/C++ sauber

Im Moment rufe ich std::terminate() an, aber mehr aus Mangel an besseren Ideen. Die Hauptsache, die mich nervt, ist nicht einmal, dass ich den Speicher nicht freigebe (weil es beim Beenden des Programms sowieso freigegeben wird, richtig?), Aber dass der MSVS-Just-in-Time-Debugger erscheint und ich eine hässliche Fehlermeldung bekomme Beenden der Laufzeit auf ungewöhnliche Weise.

EDIT: Da dies zu Verwirrung geführt hat: Rückkehr von main() mit return 0 ist in diesem Fall nicht möglich.

+6

Was ist los mit 'exit (0)'? –

+2

AFAIK std :: terminate wird verwendet, um eine ungewöhnliche Beendigung anzuzeigen (z. B. wenn eine nicht abgefangene Ausnahme die oberste Ebene erreicht). Dies könnte den Debugger auslösen. – wintermute

+1

Der saubere Weg wäre, den Kontrollfluss korrekt zu handhaben und auf eine standardmäßige Weise zu beenden (Griffe, Objekte, Verbindungsfäden usw. loslassen). 'exit (0)' ist eine hässliche Alternative – Bruce

Antwort

7

Wenn Sie betreffen Reinigung und destuctors dann

exit(EXIT_SUCCESS); // or EXIT_FAILURE 

Aufruf ist die beste Wahl zwischen exit, terminate und abort.

  • Funktion exit descructors und bereinigt um die automatischen Speicherobjekte (Das Objekt, das im globalen Bereich deklarierte) aufruft. Es ruft auch die Funktionen auf, die an atexit übergeben werden.

  • Funktion abort ist nützlich für abnormale Ausgänge und wird nichts bereinigen. Die Funktionen, die an atexit übergeben werden, werden nicht aufgerufen.

  • Funktion terminate existiert nicht in C. Es ist nützlich, wenn Sie eine Ausnahme haben und Sie nicht damit umgehen können, aber das Programm zu beenden.

+1

Exit ruft nicht alle Destruktoren auf – user1233963

+2

@ user1233963: [_ "Destruktoren von Objekten mit statischer Speicherdauer werden in umgekehrter Reihenfolge der Fertigstellung ihrer Konstruktoren oder des Abschlusses ihrer dynamischen Initialisierung aufgerufen_] (http://en.cppreference.com/w/cpp/utility/program/exit) – deepmax

+1

@M M. http://ideone.com/UHg9dk – user1233963

3

main Funktion ist, wo es beginnt, main Funktion ist, wo es normalerweise enden sollte. Wenn Sie return 0; verwenden, zeigt dies einen erfolgreichen Exit an.

int main(void) { 
    //init 
    //do stuff 
    //deinit 
    return 0; // bye bye 
} 

Sie könnten auch exit(0); verwenden, aber wenn Sie Ihre Ausstiegspunkte der ganzen Ort verstreut sind, macht es die Sache schwieriger zu debuggen.

+0

Leider kann ich 'main()' nicht zurückgeben 0. Die Verwendung von exit (0) hat jedoch funktioniert. Ich dachte immer, das wäre eine Art C-ish-Art, Programme zu beenden. – fewu

+0

@fewu Stellen Sie sicher, dass der Rückgabetyp für 'main'' int' ist. – user694733