Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Freigeben von Objekten (https://www.delphipraxis.net/191764-freigeben-von-objekten.html)

Rabenrecht 17. Feb 2017 07:19

Delphi-Version: 5

Freigeben von Objekten
 
Eine Sache, bei der ich noch sehr unsicher bin, ist die Frage, welche Objekte man mit Free/FreeAndNil wieder freigeben sollte, und wann das nicht nötig ist.

Gibt es da ein paar allgemeine Richtlinien, an denen man sich entlanghangeln kann?

Sherlock 17. Feb 2017 07:32

AW: Freigeben von Objekten
 
Alle Objekte die man selbst (also im Programmfluss) erzeugt, muss man auch wieder freigeben.
Ausnahme: Objekte, die in andere Objekte eingefügt werden, zB Listenelemente in eine Liste, können auch von dem Eigentümer freigegeben werden (vergleiche Delphi-Referenz durchsuchenTObjectList.OwnsObjects), sobald dieser wiederrum von Dir freigegebn wird.
Was Du zur Designzeit auf die Form legst (und nur das) wird beim Programmende bzw. beim freigeben der Form freigegeben.

Es gibt sicher noch ein paar Feinheiten, die im Laufe dieses lesenswerten Threads von unseren Koryphäen hinzugefügt werden, aber das dürfte ein passables Basislager sein.

Sherlock

haentschman 17. Feb 2017 07:35

AW: Freigeben von Objekten
 
Moin...:P
Im Prinzip ist es einfach...:P Was du selbst erzeugst, gibst du wieder frei. :thumb:
Ausnahmen:
* Interfaces
* TObjectListen wenn OwnObjects = True

...usw.

MichaelT 17. Feb 2017 08:18

AW: Freigeben von Objekten
 
GUI Komponenten musst du nicht freigeben. Die werden intern verwaltet.

Bei Formularen macht Release Sinn.


Zitat:

Zitat von Rabenrecht (Beitrag 1361903)
Eine Sache, bei der ich noch sehr unsicher bin, ist die Frage, welche Objekte man mit Free/FreeAndNil wieder freigeben sollte, und wann das nicht nötig ist.

Gibt es da ein paar allgemeine Richtlinien, an denen man sich entlanghangeln kann?


Christian Seehase 17. Feb 2017 08:38

AW: Freigeben von Objekten
 
Moin Rabenrecht,

ich würde diese Vorgehensweise nicht nur auf Objekte einschränken,
sondern auf alle Arten von Resourcen ausdehnen.

Um sicher zu gehen, dass man nichts vergisst wieder freizugeben,
sollte man, wenn man eine Resource belegt, auch gleich deren
Freigabe an der Richtigen Stelle unterbringen.
Meist gibt einem die Sprache hierfür schon die entsprechenden
Strukturen schon an die Hand.
Beispiele:
Eine Unit kann einen initialization und einen finalization
Abschnitt haben.
Eine Resource, die innerhalb der Unit (damit, ggf., innerhalb des
Programms zur Verfügung stehen soll) wird im initialization
Abschnitt belegt. Wenn man dann gleich im finalization-Abschnitt
die Freigabe einträgt kann man das später nicht vergessen.

Bei Klassen wären das dann constructor und destructor.

Innerhalb einer Methode/Funktion/Prozedur wird man häufig
die Try/Finally-Blöcke verwenden.
Delphi-Quellcode:
Resource belegen
try
  mit der Resource arbeiten
finally
  resource freigeben
end;
Da es wichtig ist hier nicht die Übersicht zu verlieren,
sollte man auch nie ein Objekt als Rückgabewert einer
Methode verwenden, wenn dieses erst dort erzeugt wird,
ausser die Klasse aus der die Methode stammt verwaltet
die Objekte selber (z.B. TListView.AddItem)

An welchen Stellen man Resourcen belegt und wieder freigibt
mache ich davon abhängig, wie und wie oft diese jeweils
benötigt werden.
Wenn ich, z.B., in den Methoden eines Formulares häufig eine
TStringList benötige kann es sinnvoll sein diese als Feld des
Formulares zu deklarieren und dann jeweils zu leeren statt
sie immer wieder neu zu erzeugen und freizugeben.
sinnvoll sein, diese

Rollo62 17. Feb 2017 08:54

AW: Freigeben von Objekten
 
Bei Free and FeeAndNil kannst du dir die Partei aussuchen.
Da gibt es noch vereinzelte Grabenkämpfe:
http://stackoverflow.com/questions/3...-or-freeandnil
http://stackoverflow.com/questions/3...n-a-destructor

Die Tendenz ist aber Free sollte reichen, auch wenn Emba FreeAndNil ausgiebig intern benutzt.

Und: Es gibt ja noch DisposeOf.
Das könnte interessant werden wenn du mobil mit ARC programmiert.

Rollo

Rabenrecht 17. Feb 2017 09:45

AW: Freigeben von Objekten
 
Das sind schon mal sehr hilfreiche Antworten :-)

Generell aber nur Objekte, die man mit Create erzeugt hat, oder?

Was wäre zb. mit:
Delphi-Quellcode:
procedure someMethod(Column:TColumn);
var
  Field : TField;
begin
  Field := Column.Field;
end;
Muss man hier Field.Free aufrufen?
Es wird hier ja nicht wirklich Speicher reserviert.

Der schöne Günther 17. Feb 2017 09:57

AW: Freigeben von Objekten
 
Zitat:

Zitat von Rabenrecht (Beitrag 1361923)
Es wird hier ja nicht wirklich Speicher reserviert.

Richtig. Deine lokale Variable "Field" ist nur eine Referenz auf "Column.Field". Du hast nichts "erzeugt".

Sherlock 17. Feb 2017 11:21

AW: Freigeben von Objekten
 
Ja, zu FreeAndNil gibt es viele Referate.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz