Destruktor wird nicht aufgerufen, wenn eine lokale Instanz zurückgegeben wird [duplizieren]

8

Ich habe etwas C ++ - Code geschrieben (unten), habe es mit GCC 4.6 kompiliert und es lief erfolgreich. Aber ich weiß nicht, warum der Destruktor von classA nicht aufgerufen wird, wenn er von createA() zurückkehrt.

Da ca eine lokale Variable in createA() ist (d. h. auf dem Stapel), denke ich, dass ihr Destruktor aufgerufen werden sollte, wenn er von der Funktion zurückkehrt. Tatsächlich wird der Destruktor nur einmal aufgerufen, wenn er von der Funktion main zurückkehrt.

Außerdem funktioniert die Rückgabe einer lokalen Instanz in diesem Test immer einwandfrei. Ich frage mich, ob es sicher ist, eine lokale Instanz in einem Stapelrahmen zurückzugeben, wenn der Rahmen nach der Rückkehr herausgefallen ist.

Das ist mein Code:

%Vor%     
Yantao Xie 18.06.2012, 06:41
quelle

1 Antwort

14

Dies wird Rückgabewertoptimierung genannt.

Kurz gesagt, der Compiler muss keine Kopie des Objekts zurückgeben, um den Code zu optimieren.

  

Für ca ist eine lokale Variable, d.h. auf dem Stapel [...]

Nicht unbedingt. ca kann direkt im aufrufenden Kontext erstellt werden, um die zusätzliche Kopie zu verhindern. Elision kopieren ist die einzige Optimierung, die ein Compiler ausführen kann, um das erwartete Verhalten zu ändern.

    
Luchian Grigore 18.06.2012, 06:42
quelle

Tags und Links