Programm abbruch durch ctl-c



  • Hallo,

    ein console programm:

    int* hi = new int; 
    while(true) { 
    //mach was 
    } 
    delete hi;
    

    wenn ich jetzt das console programm mit "ctl-c" abbreche, erreicht das Programm die Stellen, die unter der while sind?? (hier wäre z.b. delete hi)



  • nein.



  • Anonymous schrieb:

    nein.

    und wie macht man das dann richtig? wie soll ich abbrechen?



  • Nein, aber in diesem Fall auch nicht nötig, da das System nach Programmbeendigung selbst alle dynamischen Objekte aus dem Speicher entfernt/freigibt, aber darauf wolltest du glaub ich garnich hinaus, oder?

    Okay... Ich wollte nur auch mal "Nein" gesagt haben... 😃



  • Du könntest einen Signal-Handler für SIGINT einrichten, der eine globales Flag auf false setzt, und dann while (Flag) { ... } schreiben. Allerdings nur unter Unix.



  • mnab schrieb:

    und wie macht man das dann richtig? wie soll ich abbrechen?

    Da wir hier alle wohl extrem Objektorientiert arbeiten, sowieso alles kapseln und bei Beendigung eines Programmes immer die Destruktoren aufgerufen werden könnte man doch seine "delete"'s in den Destruktor schreiben, oder?

    Oder verhält sich das bei "Ctrl+C" anders?



  • das mit dem signalhandler geht auch unter windows.



  • dregenrocks schrieb:

    Nein, aber in diesem Fall auch nicht nötig, da das System nach Programmbeendigung selbst alle dynamischen Objekte aus dem Speicher entfernt/freigibt

    also es reicht mir dann, wenn das System sich darum kümmert nach einem "ctl-c". Die Sache mit dem Destructor mache ich immer sowieso, das Problem war aber, dass was nach "ctl-c" passiert, da der Programm selber nicht läuft (und daher auch der Destructor, oder?)



  • Ich habs grad mal mit folgendem Testproggie versucht:

    #include <iostream>
    
    using namespace std;
    
    class Endlos
    {
     public:
       Endlos() {}
       ~Endlos() { cout << "Hier ist der Destruktor"; }
       void EndlosSchleife();
    };
    
    void Endlos::EndlosSchleife()
    {
     while(1) {}
    }
    
    int main()
    {
     Endlos Schleife;
     Schleife.EndlosSchleife();
     return 0;
    }
    

    Ergebnis: Destruktor wird nicht aufgerufen.
    Vielleicht auch system- und oder compilerspezifisch?
    (Bei mir: Windows 2000, Borland C++ 5.5)



  • Das Programm wird einfach abgebrochen wo es gerade ist. Da wird nichts mehr aufgerufen, auch nicht irgenddwelche Destruktoren.



  • Na dann ist ja alles klar... 😃



  • Warum sollte auch ein Destuktor oder ein delete aufgerufen werden. Dies ist nicht nötig wenn das Programm beendet wird das in dem Fall das Betriebsystem so oder so den Speicher frei gibt. Deshalb ist ein delete vor dem beenden eines Programm allenfalls der Schönheit wegen drinn aber nicht notwendig von ctrl+c ganz zu schweigen.



  • Woher willst du wissen, dass das OS den Speicher wieder freigibt?
    Was ist wenn es das nicht tut?

    Also lieber Ressourcen immer schön brav zurückgeben.



  • es soll auch Resourcen geben, die nicht automatisch freigegeben werden (temporäre Dateien, Dateilocks, Shared Memory Segmente, ...)



  • Ein OS welches den Speicher und Resourcen nicht selbstständig wieder freigibt würde nie so eine Möglichkeit bieten ein Programm so abrupt abbrechen zu lassen.



  • Alle moderenen BS haben geschützten Speicher und geben ihn desshalb wieder frei. Unter Dos haben sich die meissten Compiler darum gekümmert (bzw. es hat es auch z.T selbst gemacht) und dann gibt es nicht mehr viel. Also kann man mal davon ausgehen ausserdem hab ich ja nichts gegen schönes Programmieren gesagt oder?



  • Soll das ein Troll werden? Welches OS kann denn sowas? Unix jedenfalls nicht, Windows auch nicht. Wahrscheinlich, weil es noch keine Gedankenlesehardware gibt.



  • Bashar schrieb:

    es soll auch Resourcen geben, die nicht automatisch freigegeben werden (temporäre Dateien, Dateilocks, Shared Memory Segmente, ...)

    Davon haben wir aber jetzt nicht gesprochen oder? Wenn ich so was anlege weiss ich es und kümmere mich auch darum.



  • Bashar schrieb:

    Soll das ein Troll werden? Welches OS kann denn sowas? Unix jedenfalls nicht, Windows auch nicht. Wahrscheinlich, weil es noch keine Gedankenlesehardware gibt.

    Nein aber ich denke du missverstehst da etwas. Wenn sich ein programm Beendet wird auch unter Unix der Speicher aufgeräumt oder etwa nicht.



  • Die Antwort war an den Unregistrierten gerichtet.


Anmelden zum Antworten