Programm sauber beenden
-
Gibt's hier eine Möglichkeit, den Prozess sauber zu beenden?
namespace { int init() { if ( ... ) exit( 1 ); //<-Unsauber!? } int Init = init(); } int main() { }
-
Exceptions sind der übliche Weg solche Sachen handzuhaben.
exit ist böse, weil es das Programm sofort beendet und du keine Chance mehr hast irgendwelche Sachen freizugeben (Destruktoren werden z.B nicht aufgerufen).
-
Aber exceptions dürften hier doch auch nicht funktionieren, oder? Oder werden die von dem drunterliegenden CRT-Framework gefangen?
-
Die Frage ist ja, ob die Exception überhaupt gefangen werden kann, da der Aufruf nicht in einem try-catch block gepackt werden kann. Es handelt sich ja um eine globale Variabel/Funktion.
-
Mich würde noch die Bedingung der
ifinteressieren...
-
Exception werfen und spätestens in main() fangen und das Programm sauber zu Ende laufen lassen. Natürlich den kompletten Code exceptionsicher schreiben. exit() ist unsauber, da werden keine Destruktoren aufgerufen und die Ressourcen nicht korrekt freigegeben. Das Aufräumen wird dem betriebssystem überlassen und das ist nicht immer das, was man will.
-
Graham schrieb:
Aber exceptions dürften hier doch auch nicht funktionieren, oder? Oder werden die von dem drunterliegenden CRT-Framework gefangen?
3.6.2§4 sagt, dass
terminate()aufgerufen wird, wenn während der Konstruktion oder Destruktion eines nichtlokalen Objektes eine Exception geworfen wird.
-
pumuckl schrieb:
Exception werfen und spätestens in main() fangen
Zum Zeitpunkt des
throwhat diemain()noch nicht einmal begonnen.
-
Bashar schrieb:
3.6.2§4 sagt, dass
terminate()aufgerufen wird, wenn während der Konstruktion oder Destruktion eines nichtlokalen Objektes eine Exception geworfen wird.Ok, sowas hatte ich mir schon gedacht. Dann gibt es einfach keine gute Möglichkeit.
@pumuckl: Es handelt sich ja um eine Variable auf Datei-Ebene, der "exit"-Code wird noch vor dem Eintritt in die main aufgerufen.
@EOutOfResources: Ich versuche grad, ein Crashdump-System aufzubauen. Unter Linux dump't man mit dem Programm "gcore"; dafür muss der dumpende Prozess aber Vater des zu dumpenden Prozesses sein. Also würde ich gerne in meiner Dump-Library so einen "File-Initializer" nutzen um den Prozess zu forken, so dass das Kind weiterläuft und der Vater dann bei Bedarf das Kind dumpen kann.