Forum: PC-Programmierung Objekt auf Stack überlebt return? o.O


von X. H. (shadow0815)


Lesenswert?

[Nachtrag:    C++ ]
Hier:
http://pastebin.com/m49568856
wird eine Objekt-Instanz result (Z.6.) auf dem Stack angelegt und bei 
(Z.12.) zurückgegeben.

Warum musste es nicht mit new auf dem Heap erzeugt werden, damit das 
neue Objekt den return überlebt?

Der ganze Code:
http://doc.trolltech.com/4.1/widgets-tetrix.html

von Klaus W. (mfgkw)


Lesenswert?

Mit
1
TetrixPiece result;
wird eine lokale Variable auf dem Stack angelegt; deren Lebensdauer
endet mit dem Ende des umgebenden Blocks. Sie kann also nicht
zurückgegeben werden - und wird es auch nicht.
Es kommt ja noch:
1
return result;
Weil deine Methode als Rückgabetyp TetrixPiece hat, wird vom
Compiler klammheimlich eine Kopie von result angelegt, die wird
zurückgegeben und beim Aufrufer irgendwann entsorgt (tatsächlich wird
beim Aufruf bereits dafür Platz auf dem Stack als versteckter
nullter Parameter geschaffen und mit den restlichen Parametern nach
dem Rücksprung entsorgt). Alles in Ordnung.

Hättest du als Rückgabetyp nicht TetrixPiece, sondern TetrixPiece&
(also eine Referenz), dann gäbe es Probleme, weil der Aufrufer
ein Objekt in der Hand hat, dessen Lebensdauer beendet ist und
der Stackbereich dafür bereits für etwas anderes verwendet
wird (möglicherweise).

von X. H. (shadow0815)


Lesenswert?

Vielen Dank für die Erklärung. Dass mit der Kopie beim Return war mir 
nicht mehr ganz klar gewesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.