![]() |
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? |
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 ![]() 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 |
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. |
AW: Freigeben von Objekten
GUI Komponenten musst du nicht freigeben. Die werden intern verwaltet.
Bei Formularen macht Release Sinn. Zitat:
|
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:
Da es wichtig ist hier nicht die Übersicht zu verlieren,
Resource belegen
try mit der Resource arbeiten finally resource freigeben end; 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 |
AW: Freigeben von Objekten
Bei Free and FeeAndNil kannst du dir die Partei aussuchen.
Da gibt es noch vereinzelte Grabenkämpfe: ![]() ![]() 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 |
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:
Muss man hier Field.Free aufrufen?
procedure someMethod(Column:TColumn);
var Field : TField; begin Field := Column.Field; end; Es wird hier ja nicht wirklich Speicher reserviert. |
AW: Freigeben von Objekten
Zitat:
|
AW: Freigeben von Objekten
Ja, zu FreeAndNil gibt es viele Referate.
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 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