exit() ??



  • Heap_und_Stack_fest schrieb:

    Der 3. Punkt stimmt schon wie du das schreibst, aber in jenem Fall wird das Objekt an den Stack übergeben - und ist somit für den Heap Geschichte... [...]
    Ich glaube mich auch daran zu erinnern irgendwo gehört und gelesen zu haben das delete nur in verbindung mit new verwendet werden soll.

    😕

    Ja, mit new legt man auf dem Heap Objekte an, deren Existenz oder Größe zur Compilezeit noch nicht feststeht. Diese landen auf dem Heap, und man muss sie mit delete löschen. Dass das bekannt ist war meine Annahme, deshalb kann ich den ersten Satz oben nicht so recht einordnen... new -> heap -> delete... Wieso ist der Heap damit Geschichte?



  • Im generellen ist das auch korrekt aber für die Funktion "exit()" ist nicht der Heap brisant sondern der Stack, darum nützt mir new() und delete() in diesem Fall nicht so ganz um "aufzuräumen". Wie schon zuvor gepostet, bestenfalls mit "atexit()".

    Aber wie auch immer, new bzw. delete ist ja kein ANSI C sondern C++ 😉



  • heap_und_stack_fest schrieb:

    Im generellen ist das auch korrekt aber für die Funktion "exit()" ist nicht der Heap brisant sondern der Stack

    exit() interessiert weder der heap noch der stack 😉
    es werden zwar noch die funktionen aufgerufen, die man mit 'atexit()' registriert hat, aber beim beenden des programms sind heap und stack ebenfalls *weg*
    (jedenfalls ist es unter windows so)
    🙂



  • Exit leistet aber sehr wohl noch ein gewisses Maß an Aufräumarbeit - im Stack - nicht aber im Heap... 😉



  • Heap_und_stack_fest schrieb:

    Exit leistet aber sehr wohl noch ein gewisses Maß an Aufräumarbeit - im Stack - nicht aber im Heap... 😉

    warum sollte 'exit' etwas mit dem stack machen, wenn der sowieso nach beendigung des programms aufgelöst wird?



  • CStoll hat in einem Thread zuvor einen Hyperlink zu exit() (openBSD-Doku) gelegt wo die Antwort auf deine Frage steht...es ist halt so 🙂



  • meinst du das?

    First, all functions registered by calls to atexit are executed in the reverse order of their registration. Then, all streams are closed and the temporary files deleted, and finally the control is returned to the host environment.

    naja, bis auf den ersten satz macht den rest das OS (gilt jedenfalls unter win)
    🙂



  • ...returned to the host environment...

    ist nicht immer unbedingt das OS... 🙂



  • Heap_und_Stack_fest schrieb:

    ...returned to the host environment...

    ist nicht immer unbedingt das OS... 🙂

    Ermmm, was dann?



  • Na, das weiß ich doch nicht! Aber es steht halt nicht OS in der Doku sondern Host Environment 🙂



  • Heap_und_Stack_fest schrieb:

    Na, das weiß ich doch nicht! Aber es steht halt nicht OS in der Doku sondern Host Environment 🙂

    Hmmm, vielleicht weil Host Environment es besser beschreibt wie Operating System??



  • Na, wohl eher das eben solche Fälle (die mir grad nicht einfallen) auch damit abgedeckt werden. 😉



  • Heap_und_stack_fest schrieb:

    Exit leistet aber sehr wohl noch ein gewisses Maß an Aufräumarbeit - im Stack - nicht aber im Heap... 😉

    exit räumt den Stack eben nicht auf. Das ist in C ja auch gar nicht notwendig, da es dort kein Destruktor-Konzept gibt. In C++ schon, daher ist exit und co in C++ nicht zu gebrauchen! (gibt bisher nur eine Ausnahme die ich kenne und wenn man auf diese Ausnahme trifft, weiß man eh das man exit nehmen muss. Daher die Regel: In C++ _nie_ exit und co!)



  • rüdiger schrieb:

    Heap_und_stack_fest schrieb:

    Exit leistet aber sehr wohl noch ein gewisses Maß an Aufräumarbeit - im Stack - nicht aber im Heap... 😉

    exit räumt den Stack eben nicht auf. Das ist in C ja auch gar nicht notwendig, da es dort kein Destruktor-Konzept gibt. In C++ schon, daher ist exit und co in C++ nicht zu gebrauchen! (gibt bisher nur eine Ausnahme die ich kenne und wenn man auf diese Ausnahme trifft, weiß man eh das man exit nehmen muss. Daher die Regel: In C++ _nie_ exit und co!)

    ich bin mir aber nicht sicher, ob bei exit() nicht auch die destruktoren von globalen und statischen C++ objekten aufgerufen werden.
    könnte aber schon sein, denn bei einem 'return' aus der main heraus wird das ja auch gemacht.



  • Unter Unix (spez. Linux, eine gute Beschreibung, was exit macht, findet man unter dem Linux/Unix Systemprogrammierung Buch) ist es nämlich so, dass exit die Funktionen aufruft, die man mit atexit definiert hat, dann wird eine cleanup Funktion aufgerufen und erst dann man: _exit(2) aufgeruft, was letztendlich den prozess vom Kernel beendet.

    Before termination, exit() performs the following functions in the order
    listed:

    1. Call the functions registered with the atexit(3) function, in
    the reverse order of their registration.

    2. Flush all open output streams.

    3. Close all open streams.

    4. Unlink all files created with the tmpfile(3) function.

    Grafik aus L/U SysProg (Folie 3) 😉


Anmelden zum Antworten