Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vor- und Nachteile von FreeAndNil und Free (https://www.delphipraxis.net/111295-vor-und-nachteile-von-freeandnil-und-free.html)

messie 1. Apr 2008 20:00


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

mkinzler 1. Apr 2008 20:02

Re: Vor- und Nachteile von FreeAndNil und Free
 
Das eigentliche Objekt ist zerstört, die Referenz (Zeiger) verweist aber noch auf die Adresse.

messie 1. Apr 2008 20:18

Re: Vor- und Nachteile von FreeAndNil und Free
 
Zitat:

Zitat von mkinzler
Das eigentliche Objekt ist zerstört, die Referenz (Zeiger) verweist aber noch auf die Adresse.

Benutzt denn das Objekt beim nächsten create wieder denselben Zeiger, oder bleibt das Objekt evtl. sogar im Speicher vorgehalten? Das würde ja einen Vorteil bei der Performance bedeuten können.

Grüße, Messie

mkinzler 1. Apr 2008 20:20

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.

dominikkv 1. Apr 2008 20:24

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:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
Wenn es dir also um Performance geht würde ich ein einfaches .free empfehlen

Panthrax 1. Apr 2008 22:49

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 17:54 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