Ich weiß, dass eine Implementierung freigegebenen Speicher freigeben sollte, wenn der Konstruktor eines Objekts in einer Situation wie dieser eine Ausnahme auslöst:
%Vor%Aber was ist mit dem folgenden Code?
%Vor%Was sollte die Implementierung in diesem Fall tun? Sollte es freigegebenen Speicher dann freigeben?
Im aktuellen C ++ - Standard (C ++ 14 sowie in den Vorgängerversionen C ++ 11 und C ++ 03) ist nicht angegeben, ob vor oder nach der Auswertung von f()
Speicher zugewiesen wird, sondern in Jeder Fallspeicher wird freigegeben, wenn er zugewiesen wurde; [expr.new] :
20 - Wenn irgendein Teil der Objektinitialisierung, die oben beschrieben ist, endet, indem er eine Ausnahme wirft, hat der Speicher für das Objekt erhalten wurden, und eine geeignete Deallokationsfunktion gefunden werden kann, ist die Deallokationsfunktion gerufen, um die Erinnerung zu befreien [...]
79) Dies kann die Auswertung eines new-initializer und / oder den Aufruf eines Konstruktors beinhalten.
Hier ist der new-initializer f()
. Wenn also die Auswertung von f()
eine Ausnahme auslöst, wird die Freigabe-Funktion aufgerufen (falls gefunden).
Seit C ++ 17 wird die Speicherzuweisung vor der Auswertung von f()
sequenziert, so dass der Speicher immer freigegeben wird:
21 - Wenn irgendein Teil der oben beschriebenen Objektinitialisierung 79 endet, indem eine Ausnahme und eine passende geworfen wird Freigabefunktion kann gefunden werden, die Deallokationsfunktion heißt [...]
Beachten Sie jedoch, dass die Implementierung in der Praxis frei ist, die Zuweisung wegzulassen, da sie vorhersagen kann, dass eine Ausnahme ausgelöst wird, da die Speicherzuweisung elidierbar ist.
Tags und Links c++