Was eine Implementierung im Falle einer neuen und "verschachtelten" Initialisierung des Operators tun sollte

8

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?

    
FrozenHeart 05.09.2016, 12:06
quelle

1 Antwort

4

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.

    
ecatmur 05.09.2016, 12:12
quelle

Tags und Links