![]() |
Funktion erstellt gibt Objekt zurück, wer räumt auf
Ich habe eine Funktion, die als Ergebnis ein Objekt zurück gibt. Kann man sich so vorstellen:
Delphi-Quellcode:
Aufruf:
function foo: TStrings;
begin result := TStringList.Create; ...; ...; result.Add('....'); result.Add('....'); result.Add('....'); end;
Delphi-Quellcode:
Meine Frage: Ich weiß nicht, wo ich den Speicher wieder freigeben soll. :gruebel:
Listbox1.Items := Foo;
Nachtrag: Normaler weise mache ich so wa smit var Parametern, dann ist der Aufrufer dafür verantwortlich das Objkekt zu erstellen und wieder zu entsorgen, aber hier muss es als read Property eine Funktion sein. |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
:gruebel:
Ist zwar irgendwie hässlich, sollte aber gehen. :roll:
Delphi-Quellcode:
noch ein Edit:
var
SL :TStrings; begin try SL := foo(); //Do something... finally if Assigned(SL) then Free(SL); end; end; Sorgt die ListBox nicht von alleine für das Freigeben von TListBox.Items? Da du Items das Ergebnis von foo übergibst, sollte das nicht dein Problem sein.
Delphi-Quellcode:
ListBox.Items.Assign(foo());
|
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Delphi-Quellcode:
var
SL :TStringList; begin try SL := foo(); finally if Assigned(SL) then Freeandnil(SL); end; end; |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Moin!
Zitat:
MfG Muetze1 |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
:wall: Na klar!
Mit einer Garbage Collection kann einem auf Dauer sogar das Denken abhanden kommen. Assign übernimmt nicht das neue Object, nachdem es die alte Instanz "aufgeräumt" hat -> es macht sich nur eine Kopie. :oops:
Delphi-Quellcode:
var
SL :TStrings; begin // auch wenn es blöd aussieht... // Da du IMHO nicht weißt ab wann die SL erzeugt wird, sollte auch foo() in den Try-Except-Block try SL := foo(); ListBox.Items.Assign(SL); finally if Assigned(SL) then Free(SL); // FreeAndNill halte ich für unnötig, da man mit SL wohl nix mehr machen wird end; end; |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Moin, moin,
irgendwie sehe ich keine echten Vorteil in der Verwendung einer Funktion vor einer Procedureübergabe mit var. Zumal hier das Ergebnis ehedem nicht gleich weiterverwendet wird (geschachtelte Funktionen). :?: :!: Grüße // Martin |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Kurze Anmerkung.. das
Delphi-Quellcode:
im Finally-Teil kann man sich sparen, da Free intern sowieso prüft ob der Self-Pointer nil ist...
if Assigned(SL) then
|
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Zitat:
Die Muster für try/finally sind nämlich:
Delphi-Quellcode:
und
V := Type.Create;
try ... finally V.Free; end;
Delphi-Quellcode:
Das V:=nil ist im zweiten Muster wichtig und der Compiler meldet das auch (aber es soll ja Leute geben, die Compiler Warnungen und Hinweise in den Wind schlagen, weil sie doch "unwichtig" sind).
V := nil;
try V := Type.Create; ... finally V.Free; end; |
Re: Funktion erstellt gibt Objekt zurück, wer räumt auf
Hi Luckie,
wenn du es als "read" property eine Klasse machst, würde ich es so lösen (hatte selbst letztens einen ähnlichen Fall). Undzwar arbeitest du in der Klasse mit einer privaten Liste, die du aussenstehenden zugänglich machst.
Delphi-Quellcode:
Ist ungetestet, sollte aber funktionieren.
TMyClass = class(TObject)
private FList: TStringList; function GetList: TStrings; public property MyList: TStrings read GetList; constructor Create; destructor Destroy; override; end; // ... constructor TMyClass.Create; begin inherited; FList := TStringList.Create; end; destructor TMyClass.Destroy; begin FreeAndNil(FList); inherited; end; function TMyClass.GetList: TStrings; begin try // Mach was mit der FList... // ... Result := FList; except Result := nil; end; end; mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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