![]() |
Wer macht den Free?
Hallo!
Ich refrakturiere gerade alten Source-Code für einen Kollegen... Die Frage ist: Wer gibt eine Instance wieder frei... (Gibt's sicher wieder ne tolle Regel) Beispiel:
Delphi-Quellcode:
Was ist wenn ich den Source von Bar nicht habe und in der Doc nix steht...
Procedure Foo; // Logisch...
var LListe : TStringList; begin LListe := TStringList.Create; try // Whatever finally LListe.Free; end; end; Procedure Bar(Const AListe : TStrings); begin // Whatever AListe.Free; // oder nicht? (wenn kein Const dann klar!) end; Function Foo2(Const AParam1,AParam2 : String) : TStrings; begin Result := TStringList.Create; Result.AddPair(AParam1,AParam2); // Whatever // Logischerweise kein Free end; Procedure Bar2; begin Bar(Foo2('Value','42')); end; Angenommen Bar gibt die Instance nicht frei, dann ist es ein MemLeak!
Delphi-Quellcode:
Besonders wenn man fremden Source liest, sieht man ggf. nicht ob man ein Object frei geben muss oder nicht.
Procedure Bar2;
var LStrings : TString; begin LStrings := Foos2('Value','42'); try Bar(LStrings); // Dann hoffen wir mal Bar hat FreeAndNIL verwendet... // Es sei den der Param ist ein Const dann geht FreeAndNIL nicht... finally FreeAndNIL(LStrings); end; end;
Delphi-Quellcode:
Wie macht Ihr das?
Function Bar3(Const AListe : TStrings) : TStrings;
begin // Den Source kenne ich nicht... end; Function Bar4; var LListe : TStrings; begin LListe := Bar3(Foo2('Value','42')); // Ist LListe meine Instance von Foo2 oder eine neue? LListe := Foo2('Value','42'); LListe := Bar3(LListe); // Hab ich jetzt ein MemLeak? end; Mavarik :stupid: |
AW: Wer macht den Free?
I.d.R. ist der der Ersteller auch für die Freigabe zuständig.
Hat man Funktionen bei denen das nicht der Fall ist, so ist der Funktions/Methodennamen entsprechend gewählt CreateMySuperDuperInstance(...) Oder man baut seine Logik auf Interfaces auf. Dann stellt sich einen die Frage gar nicht. |
AW: Wer macht den Free?
Zitat:
|
AW: Wer macht den Free?
Gerade bei TStrings hab ich in unserem eigenen Sourcecode oft gesehen, dass hier ein TArray<string> genug gewesen wäre und sich somit die Frage gar nicht mehr stellt.
|
AW: Wer macht den Free?
Delphi-Quellcode:
Function Bar3(Const AListe : TStrings) : TStrings;
begin // Den Source kenne ich nicht... end; Function Bar4; var LListe1 : TStrings; LListe2 : TStrings; begin LListe1 := Foo2('Value','42'); // unter der Annahme, daß Bar3 die Instanz nicht freigibt, was dem const ja widersprechen würde LListe2 := Bar3(LListe1); if LListe2 <> LListe2 then begin LListe2.Free; end; LListe1.Free; end; |
AW: Wer macht den Free?
Ohne Quelltext ist sowas immer ein Ratespiel. Ich würde es bei Möglichkeit einfach mal ausprobieren. Eine generelle Faustregel wäre mir nicht bekannt, allerdings halte ich mich auch an das Prinzip, dass der Ersteller für das Freigeben verantwortlich ist. Kann sonst selbst im eigenen Code recht schnell ziemlich unübersichtlich werden.
Eine der Stellen, an der man sich die C++ "Const-ness" wünscht, mit der man nicht nur die Referenz/Pointer als
Delphi-Quellcode:
markieren kann, sondern tatsächlich auch das dahinterliegende Objekt.
const
|
AW: Wer macht den Free?
Zitat:
FreeAndNil würde dem Const wiedersprechen, aber Free per se nicht. Es wird ja nicht die Variable/Parameter verändert, sondern nur das, worauf sie zeigt. :roll: Also der "Grundsatz" wurde ja schon genannt. Am Besten gibt immer der etwas frei, der es auch erstellt hat. Im Falle von solchen Results könnte die Klasse, wo die Get-Methode drin ist, eine GibFrei-Methode anbieten. Alternativ kommt es auf die Dokumentation an. Entweder die Get-Methode speichert intern den Zeiger und gibt es später frei, wenn die übergeordnete Klasse auch freigegeben wird, bzw. beim nächsten Aufruf der Get-Methode. Oder man definiert es so, dass der "Caller" in soeinem Fall das freigeben muß. (ich würde das auch präferieren) |
AW: Wer macht den Free?
Zitat:
Zitat:
AListe.Free genommen... (Manchmal) Ich muss mir also jeder Procedure einzeln ansehen und das in alle tiefen, ob jemand aufräumt... ätzend... Da lobe ich mir doch die Interfaces... Mavarik |
AW: Wer macht den Free?
"Ich refrakturiere gerade alten Source-Code für einen Kollegen..."
Das ist aber nicht sehr nett von dir ... :wink: |
AW: Wer macht den Free?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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