![]() |
Listen zurückgeben - best practice
Ich habe Funktionen, die prinzipiell generische Listen erstellen, mit denen weitergearbeitet können werden soll.
Intuitiv würde man schreiben:
Delphi-Quellcode:
Daraus ergibt sich natürlich das altbekannte Problem: wer gibt diese Liste wann wieder frei? Ist dies nun vertretbar, das dem Benutzer der Library zu überlassen?
function foo(): TList<MyClass>
Oder sollte man doch besser nen Iterator/Enumerator (was ist eigentlich der Unterschied?) zurückgeben, aber wie würde das konkret funktionieren, im Hinblick auf die generische Liste?
Delphi-Quellcode:
Selbst wenn man den Fragezeichenteil korrekt ergänzen könnte :mrgreen: hätte man aber doch immernoch das selbe "Speicherleck"?! Mir fehlt grade die zündende Idee...
function foo(): ?
var List: TList<MyClass>; begin List := TList<MyClass>.Create; ... Result := ? end; |
Re: Listen zurückgeben - best practice
Delphi-Quellcode:
procedure foo(result: TList);
begin ... end; List := TList<MyClass>.Create; foo(List); List.Free; |
Re: Listen zurückgeben - best practice
Also ich habe es bisher über einen var/out Parameter gelöst.
Da kann der Benutzer der Funktion nicht aus Versehen den Rückgabewert ignorieren. Also sowas wie:
Delphi-Quellcode:
geht dann nicht.
function foo(): TList<MyClass>
begin Result := ... end; begin foo(); // BÖSE end; Bei mir ginge es dann so:
Delphi-Quellcode:
function foo(var Result: TList<MyClass>): Irgendwas; // oder Procedure
begin Result.DoSomething; Result.Add(Irgendwas); end; var AList: TList<MyClass>; begin AList := TList<MyClass>.Create(...); try foo(AList); // Do something with AList finally AList.Free; end; end; |
Re: Listen zurückgeben - best practice
out-Parameter möchte ich nach Möglichkeit vermeiden...
|
Re: Listen zurückgeben - best practice
Delphi-Quellcode:
Die Lösung von himitsu wird wohl die beste sein, da man den Code dann einfacher lesen kann. Um aber ab und zu ein wenig Code einzusparen, nutze ich aber gerne obige Konstruktion. Ich setze vor den Methodennamen noch ein "Create", sodass ich dann beim Aufruf sehe, dass etwas erzeugt wird. Ein wirklicher Vorteil ists nicht.
function CreateFoo(): TList<MyClass>;
begin ... end; List := CreateFoo(); List.Free; |
Re: Listen zurückgeben - best practice
Darf ich mich hier einklinken?
was ist z.B. mit solchen Konstrukten:
Delphi-Quellcode:
Da sollte die Stringliste ja auch bis zum Programmende Speicher belegen.
function Testlesen(fn:string):tstringlist;
var tl : tstringlist; begin tl:=tstringlist.create; tl.loadfromfile(fn); tl.sort; result:=tl; end; ... form1.memo1.text:=Testlesen('c:\meinedatenwoauchimmer').text; .... Gruß K-H |
Re: Listen zurückgeben - best practice
Jepp, das kann man mit FastMM schön überprüfen.
|
Re: Listen zurückgeben - best practice
Weils irgendwie grade passt :mrgreen:
Was ist eigentlich damit:
Delphi-Quellcode:
Gibts ein Speicherleck oder wird die Liste mit aufgeräumt?
foo = record
bar: TList<wuppdi>; end; ... function k(): foo; a := k(); Garbage Collection FTW. |
Re: Listen zurückgeben - best practice
Das gibt ein Speicherleck, wenn du die Liste im Record erstellst, aber nicht freigibst.
Zitat:
|
Re: Listen zurückgeben - best practice
Außer man setz einen Destructor zusätzlich ein, man muss diesen dann aber halt auch aufrufen :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 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