beenden eines programms



  • Hallo!
    Ich habe ein programm, dass im wesentlichen aus vielen funktionsaufrufen besteht, da ich alles in funktionen ausgelagert habe, es sieht in etwa so aus:

    int main()
    { funktion_a();
      funtion_b();
      funktion_c();
    ...
      return 0;
    }
    

    ich möchte jetzt eine zusätzliche routine schreiben, mit der ich fehler in den einzelnen funktionen abfangen kann (dort werden dateien gelesen, felder alloziert, u.s.w), sie sollte etwa aussehen:

    void crash (string funktion, string error_message)
    {cout<<"error in "<<funktion<<" errormessage: "<<error_message<<endl;

    und dann eine anweisung enthalten, die mir das ganze programm beendet, nicht nur wie return ins rufende programm zurückkehrt und dort dann die nächste funktion ausführt, wobei es wahrscheinlich zum fehler kommt, da gewisse daten einfach wegen des vorhergehenden fehlers nicht da sind

    wie kann ich denn das am geschicktesten machen?
    lg,
    Iso

    }



  • Such mal nach try-catch-Blöcken (Exception-Handling). Damit kannst du eine ordentliche Fehlerbehandlung schreiben.

    Du könntest natürlich auch die Rückgabewerte der Funktionen als Fehlercode benutzen und z.B. einer Funktion crash übergeben. Den Fehlercode wertest du in einer case-Anweisung aus und gibst entsprechend einen Fehlertext aus.

    Das Programm direkt beenden kannst du mit der Funktion exit(). Du solltest aber vorher noch aufräumen (allozierten Speicher freigeben).



  • super, danke, exit ist super.

    eine frage - du hast geschrieben, ich solle vorher noch allozierten speicher freigeben. warum denn, wenn ich doch damit das programm beende und dann sowieso alles wieder freigegeben ist? 😕 😕

    lg,
    Iso



  • Isomorphismus schrieb:

    super, danke, exit ist super.

    eine frage - du hast geschrieben, ich solle vorher noch allozierten speicher freigeben. warum denn, wenn ich doch damit das programm beende und dann sowieso alles wieder freigegeben ist? 😕 😕

    lg,
    Iso

    Im Grunde hast du Recht. Aber soweit ich weiß, kann man sich nie wirklich darauf verlassen, dass nicht doch ein paar Speicherleichen übrig bleiben, obwohl das nicht passieren sollte. Aber da kenne ich mich auch nicht wirklich aus. Vielleicht kann jemand anderes noch etwas dazu sagen?



  • Isomorphismus schrieb:

    super, danke, exit ist super.

    eine frage - du hast geschrieben, ich solle vorher noch allozierten speicher freigeben. warum denn, wenn ich doch damit das programm beende und dann sowieso alles wieder freigegeben ist? 😕 😕

    1. exit ist leider nicht super, sauberes Beenden über return-Pfade ist immer besser
    2. Auf eine Freigabe würde ich mich nicht verlassen, da kommt es immer darauf an wie gut das Betriebssystem hinter dir aufräumt. Es ist immer besser ein Programm sauber aufzuräumen (und wenn du es nicht selbst machen willst solltest du dir Smartpointer anschauen, z.B. boost::scoped_ptr und boost::shared_ptr, bzw. falls deine STL schon tr1 kennt die Entsprechungen davon).

    cu André



  • exit() räumt leider nicht alles auf. dynamisch alloziierter speicher wird vom programm mit exit() nicht wieder frei gegeben. aber mit try-catch kann man die destruktoren ja aufrufen im fehlerfall.

    man sollte sich nicht auf das betriebssystem verlassen, obwohl die das heute automatisch machen. das heißt aber nicht das man schlampig programmieren sollte.

    ob es eine bestimmte systematik zum aufräumen gibt weiß ich aber nicht.



  • kuckucksei schrieb:

    exit() räumt leider nicht alles auf. dynamisch alloziierter speicher wird vom programm mit exit() nicht wieder frei gegeben.

    Welches OS meinst Du? Win98?



  • weder noch. ich rede von einem in c++ geschriebenen programm das mit exit() beendet wird. das war die ursprüngliche fragestellung.


Anmelden zum Antworten