![]() |
Vor- und Nachteile von FreeAndNil und Free
Moin,
mal eine Frage: wenn ich ein Objekt mit Free freigebe, bleibt es danach ja "in List". Bringt das Vorteile, wenn ein Objekt häufig erzeugt und freigegeben wird? Was passiert mit dem "Listen"-Eintrag, wenn nur Free benutzt wird? Vielleicht hat auch jemand ein paar erklärende Worte zur "Liste". Grüße, Messie |
Re: Vor- und Nachteile von FreeAndNil und Free
Das eigentliche Objekt ist zerstört, die Referenz (Zeiger) verweist aber noch auf die Adresse.
|
Re: Vor- und Nachteile von FreeAndNil und Free
Zitat:
Grüße, Messie |
Re: Vor- und Nachteile von FreeAndNil und Free
Wenn du das Ergebnis des Konstuktors der selben Variable (Referenz) zuweist. Es könnte zufällig der gleiche Speicherbereich sein; aber nicht unbedingt.
|
Re: Vor- und Nachteile von FreeAndNil und Free
Die Liste speichert einfach die Adressen von den Speicherbereichen der Pointer.
FreeAndNil(obj); kannst du gleichsetzen mit obj.Free; obj := nil; um genau zu sein
Delphi-Quellcode:
Wenn es dir also um Performance geht würde ich ein einfaches .free empfehlen
procedure FreeAndNil(var Obj);
var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; |
Re: Vor- und Nachteile von FreeAndNil und Free
Die typischen Einsatzfälle sind:
Free (genügt) immer dann, wenn das Objekt freigegeben werden soll und Objektvariable anschließend keine Funktion mehr erfüllt. FreeAndNil immer dann, wenn das Objekt freigegeben werden soll und die Objektvariable anschließend noch eine Funktion zu erfüllen hat. In beiden Fällen wird das Objekt freigegeben. Bei Free verbleibt die Objektvariable jedoch in einem "unbestimmten" Zustand (sie verweist weiterhin auf den Speicher, an dem das Objekt einmal stand). FreeAndNil hingegen gewährleistet, dass die Objektvariable anschlißend nil ist. Ein Zuweisen von Nil an die Objektvariable nach einem Aufruf von Free wäre nicht gleichwertig, da im Fehlerfall die Zuweisung eventuell nicht ausgeführt werden würde (Exception). Beispiel:
Delphi-Quellcode:
type
TExample = class(TObject) private FMyObject: TObject; public property MyObject: TObject read FMyObject write FMyObject; constructor Create; destructor Destroy; end; { TExample } constructor TExample.Create; begin inherited; FMyObject:=TObject.Create; end; destructor TExample.Destroy; begin FreeAndNil(FMyObject); { oder } FMyObject.Free; { ? } inherited; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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