![]() |
Rückgabewert von Funktionen / evtl. Problem mit try..finally
Hallo,
ich habe ein grundsätzliches Verständnisproblem was den Rückgabewert einer Funktion angeht. Bevor ich viel drum herum rede hier einfach zwei code-Beispiele:
Delphi-Quellcode:
Bei der Obenstehenden Funktion wird kein Wert zurückgegeben (bzw. wird ein Leerstring zurückgegeben).
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp; begin x:=TMeinTyp.Create; try x.property1:='Hallo 1'; x.property2:='Hallo 2'; result:=x; finally x.free; end; end; Schreibe ich hingegen..
Delphi-Quellcode:
..funktioniert alles so wie es sollte. Damit könnte man sich eigentlich zufrieden geben.
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp; begin x:=TMeinTyp.Create; x.property1:='Hallo 1'; x.property2:='Hallo 2'; result:=x; end; Aber ich würde gern dazu zwei Dinge wissen: 1. wann funktioniert result? Nur am Ende einer Funktion / außerhalb von Schleifen? 2. Wenn ich x.free nicht aufrufe, hat das irgendwelche Nachteile, oder wird x sowieso nach Funktionsende wieder freigegeben, da es sich um eine lokale Variable handelt? An try..finally kann es widerum eigendlich nicht liegen, denn wenn ich folgendes schreibe klappt es auch nicht:
Delphi-Quellcode:
Kann mir diesbezüglich jemand weiterhelfen?
function meineFkt(str: String): TMeinTyp;
var x : TMeinTyp; begin x:=TMeinTyp.Create; x.property1:='Hallo 1'; x.property2:='Hallo 2'; result:=x; x.free; end; Das wär wirklich sehr nett! mfg changlee |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Es wird dir nichts zurückgegeben, weil du das Objekt und somit den Speicherbereich wieder freigibst.
Delphi-Quellcode:
Beinhaltet nur die Kopie eines Zeigers. Gibst du mit
result := x;
Delphi-Quellcode:
das Objekt frei und machst so den Zeiger ungültig, ist auch die Kopie leer.
x.Free;
Ich würde so was imme rmit var Parametern lösen, dann weiß man dass der Aufrufer dafür verantwortlich ist, denm Speicher auch wieder aufzuräumen. L´äßt du nämlich das Free weg, hast du Speicherleichen. |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
result ist vom Typ deines Rückgabe-Typs.
Früher gabs result gar nicht. Da musste man das Ergebnis dem Funktionsnamen zuweisen. Da es aber manchmal notwendig ist, mit Zwischenergebnissen des Funktionsergebnisses innerhalb der Funktion weiter zu arbeiten, wurde von Borland Result eingeführt. Ansonsten gibt es rekursive Funktionsaufrufe. Das bedeutet in deinem Fall, solange du die Werte deiner Variablen nicht der Funktion oder result zuweist, weiß die Funktion auch nicht welchen Wert sie zurückliefern soll. Deine temporäre Variable benötigst du also gar nicht, da du Result dafür verwenden kannst. |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Es wird der Wert zurückgegeben der zuletzt in result gespeichert.
Da Objekte als Zeiger übergeben werden, wird auch nur der Zeiger zurückgegeben und wie Luckie schon sagte, zerstörst du das Objekt bevor du die Funktion beendest. Deshalb bekommst du nichts sinnvolles zurück. [edit]Willkommen bei der Delphi-PRAXIS. :party: [/edit] |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Zitat:
|
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Hallo,
vielen Dank für die schnellen aussagekräftigen Antworten! Ich werde es jetzt wohl mit var-Parametern lösen. mfg changlee |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Zitat:
|
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
OK, das Schlüsselwort var dürfte zwar überflüssig sein. Macht aber deutlich was passiert.
|
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Hi,
warum nicht? (Lucky hatte es doch auch so vorgeschlagen). mfg changlee |
Re: Rückgabewert von Funktionen / evtl. Problem mit try..fin
Ich bin nicht unfehlbar und es mag noch andere Möglichkeiten geben ohne dass ein Speicherleck zurück bleibt. Nur mir var Parametern scheint es mir am einfachsten und sichersten zu sein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz