Einzelnen Beitrag anzeigen

Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Function Result ist Klasse Wie freigeben?

  Alt 14. Aug 2006, 10:58
Zitat von Alexander Roth:
aber ich möchte wissen wie man es anders hinkriegt.
Was denn eigentlich?

Du hast unter "old" eine Stringliste. Deine erste Variante:
Zitat von Alexander Roth:
Delphi-Quellcode:
function a(old:Tstringlist):Tstringlist;
begin
  result:=Tstringlist.Create;
  result.Clear;
// result.Free;
end;
erzeugt eine neue Stringliste (diese ist per se leer); dann leerst Du sie und gibt sie als Ergebnis (result) zurück. "Dort" kann dann damit gearbeitet werden.

Zitat von Khabarakh:
Rückgabewerte einer Funktion muss der Aufrufer dieser Funktion freigeben.
Du musst sie also "irgendwo" selbst wieder freigeben, z.B.:
Delphi-Quellcode:
// irgendeine Prozedur
var sListeAlt: TStringList;
    sListeNeu: TStringList;
...
// sListeAlt muss bereits erzeugt sein
  sListeNeu := a(sListeAlt);
...
  sListeNeu.Free;
Zitat von Alexander Roth:
und wenn man es nicht created dann zeigt anscheinend result auf old.
Nein: Wenn der Befehl "result:=Tstringlist.Create;" nicht ausgeführt werden soll, zeigt Result "irgendwohin" und führt in "irgendeiner Prozedur" sehr schnell zu Zugriffsverletzungen.

Zitat von Alexander Roth:
Natürlich könnte ich das umgehen
Delphi-Quellcode:
procedure a(var new:Tstringlist; old:Tstringlist);
begin
  new.clear;
end;
Bei diesem Verfahren wird "new" geleert (natürlich auch mit Exception, wenn es nicht vorher erzeugt wurde) und sonst nichts - es gibt keinen Zusammenhang mit "old".

Nebenbei: Eine Stringliste muss nicht als "var" deklariert werden; man kann sie auch als "const" manipulieren. (Ich weiß nicht genau warum; vielleicht unterscheiden sich da auch Delphi-Versionen.)

Also meine Hauptfrage bleibt: Was willst Du eigentlich? Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat