2016-04-26 13 views
2

In cppreference abort, haben wirWas sind die möglichen Auswirkungen eines unvermeidlichen Aufrufs von abort()?

Destructors von Variablen mit automatischer, Gewinde lokale und statische Speicherdauer werden nicht genannt. Funktionen, die an std :: atexit() übergeben werden, werden ebenfalls nicht aufgerufen. Ob offene Ressourcen wie Dateien geschlossen sind, ist in der Implementierung definiert.

Ich bin etwas verwirrt über die Terminologie und Widerspruch der Abbruch Begriff, mein Programm und aus der Beschreibung dieser Funktion „schließt“, die er sagt, dass Destruktoren und offen möglicherweise Ressourcen genannt werden/nicht geschlossen, beziehungsweise. Also, ist es möglich, dass mein Programm läuft und einige Speicherlecks oder Ressourcen noch geöffnet sind nach einem Aufruf von abort()?

+0

Könnte nicht genau ein Betrogener sein, aber könnte helfen, zu verstehen: http://StackOverflow.com/Questions/397075/what-is-the-difference-between-exit-and-abort – Tas

+1

Das Programm kann nicht beide abbrechen und laufe weiter, das ist ein Widerspruch. Da es nach dem Abbruch nicht existiert, kann es auch keinen Speicherleck geben - das ist zur Laufzeit relevant. Was möglicherweise passieren könnte, ist, dass andere externe Ressourcen nicht ordnungsgemäß bereinigt werden (wie temporäre Dateien usw.) –

+0

@ DanMašek: re "Da es nicht existiert, nachdem es abgebrochen wurde, kann auch kein Speicher ausgelaufen sein", gibt es keine Verbindung von der Prämisse bis zum Abschluss, tut mir leid. Immer noch mit modernen Betriebssystemen für allgemeine Computer wird Speicher im Allgemeinen zurückgewonnen. –

Antwort

2

Es ist wie eine Person zu töten. Sie haben keine Chance, ausstehende Rechnungen zu begleichen, ihr Erbe zu organisieren, ihre Wohnung zu säubern usw.

Ob dies geschieht, obliegt ihren Verwandten oder anderen Dritten.

Also normalerweise Dinge wie offene Dateien geschlossen werden und kein Speicher wird durchgesickert, weil das OS kümmert sich darum (wie wenn die Polizei oder so die Wohnung leeren). Es gibt einige Plattformen, wo dies nicht passieren wird, wie 16-Bit-Windows oder eingebettete Systeme, aber unter modernen Windows- oder Linux-Systemen wird es in Ordnung sein.

Was jedoch definitiv nicht passieren wird, ist, dass Destruktoren ausgeführt werden. Das wäre so, als hätte die Todessende einen letzten Eintrag in ihr Tagebuch geschrieben und es versiegelt - nur die Person selbst weiß es zu tun, und sie können es nicht, wenn man sie ohne Vorwarnung tötet. Wenn etwas Wichtiges in einem Destruktor passieren sollte, kann es problematisch sein, aber normalerweise nicht dramatisch - es könnte etwas sein, dass das Programm irgendwo eine Temporäre Datei erstellt hat und sie normalerweise beim Beenden löschen würde, und jetzt kann es nicht und Die Datei bleibt erhalten.

Ihr Programm wird geschlossen und nicht mehr ausgeführt. Es wird einfach keine Chance haben, Dinge aufzuräumen und ist daher abhängig vom Betriebssystem, das Richtige zu tun und die von ihm genutzten Ressourcen zu bereinigen.

+0

Verdammt, diese Antwort hat alles für mich geklärt ... Die anderen auch. Danke für alles! –

4

Funktionen, die an std :: atexit() übergeben werden, werden auch nicht aufgerufen. Ob offene Ressourcen wie Dateien geschlossen sind ist die Implementierung definiert.

Dies bedeutet, dass die Implementierung entscheidet, was passiert. Auf jedem gängigen Betriebssystem werden die meisten Objekte, die mit Ihrem Prozess verknüpft sind, beim Beenden des Prozesses zerstört. Das bedeutet, dass Sie keinen Speicher verlieren, der zum Beispiel mit new zugewiesen wurde, oder Dateien öffnen.

Es gibt möglicherweise ungewöhnliche Arten von Objekten, die nicht freigegeben werden. Wenn Sie beispielsweise einen freigegebenen Speicherblock haben, bleibt er möglicherweise für den Fall, dass ein anderer Prozess versucht, darauf zuzugreifen. Oder wenn Sie eine temporäre Datei erstellt haben, die später gelöscht werden soll, wird die Datei dort bleiben, da Ihr Programm nicht in der Lage ist, sie zu löschen.

2

Auf Unix liefert abort() effektiv ein SIGABRT-Signal an Ihren Prozess. Das Standardverhalten des Kernels, wenn dieses Signal geliefert wird, besteht darin, den Prozess zu schließen, möglicherweise eine Kerndatei zu hinterlassen und alle Deskriptoren zu schließen. Der Steuerungsstrang Ihres Prozesses wird vollständig entfernt. Beachten Sie, dass dies alles außerhalb jeder Vorstellung von C++ (oder einer anderen Sprache) geschieht. Aus diesem Grund wird die Implementierung als definiert angesehen.

Wenn Sie das Standardverhalten ändern möchten, müssen Sie einen Signalhandler installieren, um SIGABRT abzufangen.

+1

Dies ist technisch die gründlichste Antwort. – CherryDT

Verwandte Themen