AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Vor- und Nachteile von FreeAndNil und Free
Thema durchsuchen
Ansicht
Themen-Optionen

Vor- und Nachteile von FreeAndNil und Free

Ein Thema von messie · begonnen am 1. Apr 2008 · letzter Beitrag vom 1. Apr 2008
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 20:00
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 20:02
Das eigentliche Objekt ist zerstört, die Referenz (Zeiger) verweist aber noch auf die Adresse.
Markus Kinzler
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 20:18
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 20:20
Wenn du das Ergebnis des Konstuktors der selben Variable (Referenz) zuweist. Es könnte zufällig der gleiche Speicherbereich sein; aber nicht unbedingt.
Markus Kinzler
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 20:24
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
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#6

Re: Vor- und Nachteile von FreeAndNil und Free

  Alt 1. Apr 2008, 22:49
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;
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  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 20:12 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