www.mikrocontroller.net

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


Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit
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:
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).

Autor: X. H. (shadow0815)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.