Lassen Sie uns ein Stück Code haben (fstream ist nur ein Beispiel, wir könnten über die dynamische Speicherzuweisung sprechen ...):
%Vor%Wenn etwas schief geht, möchte ich die Datei schließen () (release memory oder was auch immer), aber ich kenne den Zustand von f nicht. Schließlich kann die Ausnahme von f.open () kommen. Ich denke nicht, dass es sicher wäre, in der Fangklausel f.close () aufzurufen, da ich f nicht mehr glauben kann.
f könnte auch ein Zeiger auf ein dynamisch zugewiesenes Array sein, das ich [] löschen möchte, aber wer weiß, wohin es zeigt, nachdem die Ausnahme ausgelöst wurde ...
Das mag nicht sehr häufig sein, aber was kann ich tun, wenn ich keinen zusätzlichen Schaden mehr zufügen kann?
Ich kann über einen sofortigen Abbruch nachdenken ().
Danke.
fstream
Destruktoren rufen close
für dich auf. Wenn eine Ausnahme ausgelöst wird, wird die Datei automatisch geschlossen.
Zum Verwalten von Speicher können Sie intelligente Zeiger verwenden.
Zum Verwalten von Mutexen oder allgemeineren Sperren stellen die meisten Bibliotheken eine Klasse bereit, deren Destruktor den Mutex für Sie freigibt.
Schreiben Sie niemals Code in das Formular:
%Vor%Verwenden Sie stattdessen Objekte, deren Destruktoren die Ressource für Sie freigeben.
Der fstream-Destruktor ruft close () für Sie auf, so dass Sie ihn nicht wirklich selbst schließen müssen (es sei denn, Sie möchten den Rückkehrcode von close () sehen).
In Ihrem Beispiel können Sie die Deklaration von f
in den Block try
verschieben, um sicherzustellen, dass sie sich selbst zerstört; Der Destruktor kennt den Status des Objekts.
Als weiteres Beispiel können Sie bei der Speicherzuweisung den Zeiger auf 0 setzen, bevor der Speicher tatsächlich zugewiesen wird, und ihn dann wieder auf Null zurücksetzen, wenn Sie den zugewiesenen Speicher freigeben. Damit können Sie überprüfen, ob Speicher zugewiesen wurde, um die Freigabe von Speicher zu vermeiden, der nicht mehr Ihnen gehört. Beispiel:
%Vor%Auch hier könntest du RAII benutzen. Beispiel:
%Vor% Beachten Sie, dass RAII als übergeordnet gilt, da Sie Bereinigungscode nur einmal - im Destruktor - und nicht nach jedem try
-Block schreiben.