Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free (https://www.delphipraxis.net/80803-unterschied-zwischen-freeandnil-objekt-und-objekt-free.html)

pertzschc 15. Nov 2006 21:30

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Interessant was sich aus der Frage alles so ergibt!

Aber meine Detailfrage ist nun immer noch nicht vollständig beantwortet:
Ich habe eine Klasse TMyVar mit einem Member vom Typ TStringlist. Diese Member wird im Konstruktor meiner Klasse ordnungsgemäß erzeugt. Jetzt benutze ich die Klasse in einer function/procedure:
Delphi-Quellcode:
procedure TForm1.Beispiel;
var
  MyVar: TMyVar;
begin
  MyVar:=TMyVar.Create;
  // hier passiert dann mal was...
  ...
  // hier ist das Ende der Procedur:
  FreeAndNil(MyVar); // a)
  MyVar.Free;       // b)
                     // c)
end;
Ist nun Variante a), b) notwendig oder muss man c) gar nichts damit machen, da am Ende der Methode die lokale Variable myVar automatisch einen .Free-Aufruf erhält?

Gruß,
Christoph

Luckie 15. Nov 2006 21:36

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von pertzschc
oder muss man c) gar nichts damit machen, da am Ende der Methode die lokale Variable myVar automatisch einen .Free-Aufruf erhält?

Delphi hat keine GarbageCollection. Die Variable wird ungültig, aber der Speicher ist noch reserviert, ergo muss ein Feee erfolgen.

3_of_8 15. Nov 2006 21:42

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Kann man bei Records, Strings und dynamischen Arrays nicht von Garbage Collection sprechen?

Flocke 15. Nov 2006 22:00

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von Muetze1
Einer von den Geeks hier im Forum könnte uns mal aufklären, warum in DL unbedingt eine 1 stehen muss beim Aufruf von Destroy

Jeder Konstruktor und Destruktor bekommt von Delphi noch einen impliziten zusätzlichen Parameter mit der Info, ob der Speicher für das Objekt angefordert/freigegeben werden muss oder nicht. Beim direkten Aufruf eines Konstruktors/Destruktors ist dieser Parameter 1, bei inherited-Aufrufen 0.

Muetze1 15. Nov 2006 22:09

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von Flocke
Zitat:

Zitat von Muetze1
Einer von den Geeks hier im Forum könnte uns mal aufklären, warum in DL unbedingt eine 1 stehen muss beim Aufruf von Destroy

Jeder Konstruktor und Destruktor bekommt von Delphi noch einen impliziten zusätzlichen Parameter mit der Info, ob der Speicher für das Objekt angefordert/freigegeben werden muss oder nicht. Beim direkten Aufruf eines Konstruktors/Destruktors ist dieser Parameter 1, bei inherited-Aufrufen 0.

Danke, aber das hat Hawkeye219 mit einem vortrefflichen Post aus der Borland Hilfe/Referenz schon geklärt.

hoika 16. Nov 2006 05:08

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Hallo Kha..,

was heisst, muss nicht sein ?
Schon klar, dass man sowas vermeiden sollte.

Es ist aber so, dass FreeAndNIL nicht initialisierte Objekte
nicht erkennen kann.
Dafür gibt es ja dass NIL setzen.

Zum "Was sollte man nehmen".

Destroy nie direkt aufrufen.
Zum Freigeben .Free benutzen, falls das Objekt später nicht mehr benutzt wird,
weil es z.B. eine lokale Variable ist.
FreeAndNIL fasst 2 Befehle zusammen (Free and NIL, wer hätte das gedacht ;) ),
macht also Sinn, wenn das Objekt mehrfach verwendet werden kann.

Wir ein Objekt über lokale Variable erzeugt und nicht freigegeben,
bleibt der Speicher belegt, bis das Programm beendet wird (nicht unter Win9X).
Wenn ich also so eine Prozedur 1 Mio. mal im Programm benutze,
frisst die jedes mal Speicher.
Und irgendwann sind auch 2 Gig weg.


Heiko

Khabarakh 16. Nov 2006 12:17

Re: Unterschied zwischen FreeAndNil(Objekt) und Objekt.Free
 
Zitat:

Zitat von hoika
was heisst, muss nicht sein ?

Die Wahrscheinlichkeit ist zwar eher gering, aber Pointer-Gefuchtel kann entweder nicht-reservierten Speicher treffen -> AV oder eben zufällig doch auf einen reservierten Teil zeigen. Was allerdings noch schlimmer ist, da sich das Programm im Gegensatz zum ersten Fall nach einem Free- oder sonstigen Aufruf dann in einem unvorhersagbaren, inkonsistenten (Speicher-)Zustand befindet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.
Seite 3 von 3     123   

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