AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Freigeben von Objekten

Ein Thema von Rabenrecht · begonnen am 17. Feb 2017 · letzter Beitrag vom 17. Feb 2017
Antwort Antwort
Rabenrecht

Registriert seit: 9. Dez 2016
61 Beiträge
 
Delphi XE5 Professional
 
#1

Freigeben von Objekten

  Alt 17. Feb 2017, 08:19
Delphi-Version: 5
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
2.844 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 08:32
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
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
3.681 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 08:35
Moin...
Im Prinzip ist es einfach... Was du selbst erzeugst, gibst du wieder frei.
Ausnahmen:
* Interfaces
* TObjectListen wenn OwnObjects = True

...usw.
  Mit Zitat antworten Zitat
MichaelT

Registriert seit: 14. Sep 2005
188 Beiträge
 
#4

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 09:18
GUI Komponenten musst du nicht freigeben. Die werden intern verwaltet.

Bei Formularen macht Release Sinn.


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?

Geändert von MichaelT (17. Feb 2017 um 09:22 Uhr)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.257 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 09:38
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
1.115 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 09:54
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
  Mit Zitat antworten Zitat
Rabenrecht

Registriert seit: 9. Dez 2016
61 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 10:45
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.
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
4.135 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 10:57
Es wird hier ja nicht wirklich Speicher reserviert.
Richtig. Deine lokale Variable "Field" ist nur eine Referenz auf "Column.Field". Du hast nichts "erzeugt".
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
2.844 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Freigeben von Objekten

  Alt 17. Feb 2017, 12:21
Ja, zu FreeAndNil gibt es viele Referate.

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf