exit() Funktionsweise

ibafluss

Erfahrenes Mitglied
Hey Leute!
Ich habe eine Frage bezüglich exit() in C++. Wenn ich ein Programm mit exit() beende, wird ja ganz normal der Speicher vom Stack wieder freigegeben. Destruktoren werden hierbei allerdings keine mehr gerufen oder?
Das heißt ja, dass bei einem Aufruf von exit() das Programm ganz sicher beendet wird oder gibt es eine Möglichkeit, das Programm trotzdem weiterlaufen zu lassen?

Lg
 
Ich kenne diesen Befehl aus PHP und dort ist es so, dass danach das Skript sofort beendet wird, also auch keine Destruktoren mehr aufgerufen werden. Da ich mir nicht so sicher bin, ob dass in C++ verfügbar ist, C++ aber eine objektorientierte Sprache ist, würde ich dir mal vorschlagen, dass du dir mal Exceptions ansiehst.
 
Der Grund für die Frage ist folgender: Ich habe ein Programm in meinem C++ Buch gefunden, nur gibt es bei diesem Programm eine Endlosschleife und dann stürzt das Programm ab. Und das geschieht immer genau an der Stelle, an der das exit() aufgerufen wird. Irgendwie wiederholt sich der Aufruf von exit() immer wieder. Ich wollte jetzt nicht das ganze Programm posten sondern eben viel mehr Informationen, wie soetwas zustande kommen kann.
 
Nein, es wiederholt sich von selbst. In einem Destructor wird exit() gerufen. Und dieser Aufruf wiederholt sich immer wieder. Deshalb hatte ich den Verdacht, dass exit() wieder diesen Destructor aufruft, und so die Endlosschleife entsteht.
Ich habe gerade noch etwas herausgefunden:

C++:
~D()
{
      if (.....)
      {
             exit();
             // Dieser Teil wird nie erreicht
      }
}
 
Wenn exit den Dest wieder aufruft, muss es ja so sein.

Problemwurzel: Warum exit im Dest?
Das kann man sicher auch anders lösen.
 
Ich habe da gerade folgendes gefunden:
http://www.opengroup.org/onlinepubs/009695399/functions/exit.html hat gesagt.:
The exit() function shall first call all functions registered by atexit(), in the reverse order of their registration, except that a function is called after any previously registered functions that had already been called at the time it was registered. Each function is called as many times as it was registered. If, during the call to any such function, a call to the longjmp() function is made that would terminate the call to the registered function, the behavior is undefined.

If a function registered by a call to atexit() fails to return, the remaining registered functions shall not be called and the rest of the exit() processing shall not be completed. If exit() is called more than once, the behavior is undefined.
 
Wenn ich in einem Programm exit() aufrufe, werden normalerweise keine 'Destruktoren aufgerufen. Außer die von static class membern, das hat mir ein Testprogramm gerade gezeigt. Dann weiß ich auch, was das Problem ist: Der Destructor, der aufgerufen wird, stammt von einem static class member. Ich vermute einmal, dass das die Endlosschleife verursacht.
 
Zurück