AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

free oder freeAndNil()

Ein Thema von Gambit · begonnen am 31. Mär 2005 · letzter Beitrag vom 1. Apr 2005
Antwort Antwort
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

free oder freeAndNil()

  Alt 31. Mär 2005, 22:08
Hallo,

wann ist welche von den beiden folgenden Implementierungen besser?

Delphi-Quellcode:
var
  myList : TList;

begin
  myList := TList.Create;
  ...
  myList.free;
end;
Delphi-Quellcode:
var
  myList : TList;

begin
  myList := TList.Create;
  ...
  FreeAndNil(myList);
end;
Ich habe da immer noch Probleme, wie ich ein Objekt am besten deinstanziere, so dass wirklich nichts mehr schiefgehen kann...

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:10
Dann mach es so:
Delphi-Quellcode:
var
  myList : TList;

begin
try
  myList := TList.Create;
  ...
finally
  FreeAndNil(myList);
end;
end;
Wenn dus danach nicht mehr brauchst, kannst du auch free nehmen, der einzige Unterschied ist, dass du dann nicht mit Assign() prüfen kannnst ...
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#3

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:32
Eigentlich ganz simpel:

Free gibt den Speicherplatz frei, setzt aber nicht den Zeiger auf diesen Speicherbereich auf nil. Das heißt der Zeiger hängt hinterher und zeigt ins Nirvana.

FreeAndNil gibt den Speicherplatz frei und setzt hinterher den Zeiger auf nil.

Erstere Methode:

MyList ist ja nicht anderes als ein Zeiger, der auf den Speicherbereich zeigt, wo MyList seine Daten liegen hat. MyList.Free gibt diesen Speicherbereich frei, aber MyList zeigt nach wie vor in die Richtung. Würde man hinterher MyList.Add machen, würde das einen Crash verursachen.

Zweitere:

FreeAndNil(MyList) gibt den Speicherbereich frei und setzt MyList auf Nil. MyList.Add verursacht nach wie vor einen Crash, aber man kann if Assigned(MyList) then MyList.Add aufrufen, was im ersteren Fall (nur Free) auch zum Crash führt, im zweiteren aber nicht.

Fazit: FreeAndNil rufst Du immer dann auf, wenn Du mit der freizugebenden Variablen weiter arbeiten willst. Free alleine reicht, wenn Du das nicht vor hast (z.B. kann man am Ende einer Prozedur die lokalen Variablen per Free frei geben, ebenso im Destruktor einer Klasse die Klassenfelder, in jeder anderen Klassenmethode würde man zur Freigabe von Klassenfelder eher FreeAndNil verwenden).

Grundsätzlich gilt: Wenn Du dir nicht sicher bist, dann verwende lieber FreeAndNil. Damit machst Du nichts falsch.
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#4

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:34
Zitat von jfheins:
Wenn dus danach nicht mehr brauchst, kannst du auúch free nehmen, der einzige Unterschied ist, dass du dann nicht mit Assign() prüfen kannnst ...
Und was heißt denn nun, "wenn dus nicht mehr brauchst..."? Ich meine, wenn ich das Objekt(also aList) wieder brauche, muss ich es doch eh neu instanzieren, oder nicht - egal ob ich aList.free oder freeAndNil(aList) benutze.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:38
Es könnte aber sein das du dein Create von einer if bedingung abhängig machst, z.b so:

Delphi-Quellcode:
FreeAndNil(List);
if bla then
  List := TList.Create;
if Assigned(List) then....
Das soll nur ein Beispiel sein, da man auch nach der bla abfrage nen begin, end block benutzen könnte..
Wie gesagt...nur ein Beispiel^^
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:40
Zitat von Gambit:
Zitat von jfheins:
Wenn dus danach nicht mehr brauchst, kannst du auúch free nehmen, der einzige Unterschied ist, dass du dann nicht mit Assign() prüfen kannnst ...
Und was heißt denn nun, "wenn dus nicht mehr brauchst..."? Ich meine, wenn ich das Objekt(also aList) wieder brauche, muss ich es doch eh neu instanzieren, oder nicht - egal ob ich aList.free oder freeAndNil(aList) benutze.
Ja schon, aber falls es sein könnte, dass noch irgendwer darauf zugreifen will FreeAndNil (z.B. bei globalen Objekten oder Klassenfeldern)
Eine lopkale Variable würde ich meistens mir .Free freigeben, da man dise meist nur einmal braucht, dann benutzt, und am Ende freigibt, kann es auch nicht sein, dass du nochmal drauf zugreifst.

Der einzige Unterschied ist halt, dass du per Assign() prüfen kannst, ob das Objekt existiert. (Was unsinnig ist, wenn du's eh nicht mehr brauchst)
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#7

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 22:43
@btb930: da warst du schneller, ich glaube(hoffe) jetzt hab ichs begriffen...

in deinem Beispiel würde ich, nachdem ich irgendwann mit freeAndNil(aList) freigegeben hätte, vor einem Aufruf von aList.add() mit assigned(aList) prüfen und wenn nicht assigned(aList) den Konstruktor wieder aufrufen bevor ich mit aList.add() weitermache?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: free oder freeAndNil()

  Alt 31. Mär 2005, 23:08
Moin Julius,

Deine Idee mit dem try/finally-Block als Resourcenschutzblock war zwar gut und richtig, hatte im gezeigten Beispiel eine kleine Macke:
try kommt bei try/finally nach dem Create, denn wenn Create schon fehlschlägt, hat man im finally-Abschnitt auch nichts freizugeben.

Allgemein:
Code:
<Resource belegen>
[b]try[/b]
  <Mit der Resource arbeiten>
[b]finally[/b]
  <Resource freigeben>
[b]end;[/b]
Das ist jetzt Ansichtssache, aber ich gebe immer mit FreeAndNil frei, damit ich nicht an entscheidender Stelle mal das Falsche verwende.
Da ich mir das als Quelltextvorlage abgelegt habe ist es auch nicht mehr Tipparbeit
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
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: free oder freeAndNil()

  Alt 1. Apr 2005, 09:53
Hallo Gambit,
vielleicht hilft der Beitrag FreeAndNil vs TObject.free weiter.
gruß, choose
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#10

Re: free oder freeAndNil()

  Alt 1. Apr 2005, 10:24
Ja, war hilfreich, Danke!

Gruß

Gambit
  Mit Zitat antworten Zitat
Antwort Antwort


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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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