Registriert seit: 6. Okt 2003
372 Beiträge
|
Re: free oder freeAndNil()
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.
|