Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gibt TObject Speicherplatz wieder frei ? (https://www.delphipraxis.net/51833-gibt-tobject-speicherplatz-wieder-frei.html)

Hansa 19. Aug 2005 21:05


Gibt TObject Speicherplatz wieder frei ?
 
Hi,

ich habe hier eine Prozedur, deren Parameterliste wird immer größer. Die habe ich jetzt umgebaut in ein TObject. Brauche 2 Methoden und die vorherigen Paramter sind nun Felder vom TObject. Die Delphi-Hilfe ist nun recht knapp und etwas irreführend. Offensichtlich muß ich die Dinger mit Create erzeugen, aber wie siehts mit der Freigabe aus ?

kiar 19. Aug 2005 21:10

Re: Gibt TObject Speicherplatz wieder frei ?
 
moin Hansa,


vllt
Delphi-Quellcode:
DieDinger.free
raik

jbg 19. Aug 2005 21:11

Re: Gibt TObject Speicherplatz wieder frei ?
 
"Wer was erzeugt, ist auch für die Freigabe verantwortlich".

Du musst das Objekte selber mit .Free wieder freigeben. Am besten macht das die Funktion bzw. das übergeordnete Objekt, das auch dein Hilfobjekt erzeugt hat.

jfheins 19. Aug 2005 21:13

Re: Gibt TObject Speicherplatz wieder frei ?
 
Delphi-Quellcode:
procedure DoSomething (Obj: TMyObj);
begin
Obj.DoSomethingElse;
Form1.Caption := Obj.Text;
end;

// ...

begin
  Obj := TMyObj.Create;
  Obj.FillWithData;
  DoSomething (Obj);
  Obj.Free;
end;
;)

Hilft dir das ?

Hansa 19. Aug 2005 21:24

Re: Gibt TObject Speicherplatz wieder frei ?
 
Mann, seid ihr flott. :mrgreen:

Aber was hat das hier zu bedeuten :

Zitat:

Zitat von DH
Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free. Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.

Die in TObject definierte Version von Destroy gibt den Speicher frei. Abgeleitete Objekte definieren normalerweise einen eigenen Destruktor.

Wenn Sie eine Methode Destroy in einem abgeleiteten Objekt deklarieren, beachten Sie folgendes: Fügen Sie in die Deklaration immer die Direktive override ein, und rufen Sie als letzte Anweisung in der überschriebenen Methode die geerbte Version von Destroy auf. Da Destroy eine virtuelle Methode ist, stellen Sie durch Überschreiben der Methode sicher, dass das gewünschte Verhalten auftritt.

Hinweis: Wenn ein Konstruktor eine Exception nicht behandelt, wird der Destruktor aufgerufen, der die unvollständig initialisierte Objektinstanz wieder freigibt. Deshalb sollten Destruktoren vor der Freigabe überprüfen, ob die zugewiesenen Ressourcen, wie z.B. Handles, tatsächlich zugewiesen wurden (deren Wert könnte Null sein).

Die Methode Destroy sollte so implementiert werden, dass sie Free für Unterobjekte aufruft, die durch den Objektkonstruktor erzeugt (zugewiesen) wurden. Im Gegensatz zu Destroy besitzt Free einen Sicherheitsmechanismus für die Freigabe von Objekten, die nil sind.

An anderer Stelle steht auch noch, man solle Create nicht explizit aufrufen. :shock: Habe jetzt noch in funktionierendem Programm nachgesehen, wie ich es da gemacht habe. Und zwar mit Destroy und nachfolgendem := NIL. Weiß jetzt nicht mehr genau warum, aber daran war Borland höchstpersönlich beteiligt !

jfheins 19. Aug 2005 21:28

Re: Gibt TObject Speicherplatz wieder frei ?
 
also Create nicht direkt aufrufen :shock:
Ich glaube, das Risiko kannst du eingehen ;)

.Destroy gibt den Speicher frei,

.Free:
Delphi-Quellcode:
if xyz <> nil then
  yxz.Destroy
freeAndNil:
Delphi-Quellcode:
xyz.free;
xyz := nil;
(in etwa ;))

Dax 20. Aug 2005 00:16

Re: Gibt TObject Speicherplatz wieder frei ?
 
Den Konstruktor aufrufen bedeutet
Delphi-Quellcode:
obj := TObject.Create;
Den Konstruktor explizit aufrufen wäre
Delphi-Quellcode:
obj.Create
;)

Hansa 20. Aug 2005 00:30

Re: Gibt TObject Speicherplatz wieder frei ?
 
Habe die erste Variante verwendet. Aber, wie gesagt, es geht um das danach, also das freigeben.

Dani 20. Aug 2005 01:12

Re: Gibt TObject Speicherplatz wieder frei ?
 
:shock: Wie kann man 5000 Beiträge in einem Delphi-Forum sammeln ohne...schon gut. Resourcenschutzblock nicht vergessen. :warn:

Delphi-Quellcode:
procedure foo;
var Inst: TMyObject;
begin
  //Instanz erzeugen
  Inst := TMyObject.Create;
  try
   //Etwas machen, das eine Exception auslösen kann
   Inst.DoSomething;
  finally
   //Sicherstellen, dass das Objekt freigegeben wird
   Inst.Free;
  end;
 //Ab hier nicht mehr auf Inst zugreifen, sonst AV
end;
Wenn das Objekt im Constructor Instanzen von anderen Klassen erzeugt, müssen die unbedingt im Destructor wieder freigegeben werden.

Delphi-Quellcode:
type
  TMyObject = class(TObject)
  private
   FStrings: TStrings;
   procedure SetStrings(Value: TStrings);
  public
   constructor Create;
   destructor Destroy; override;
  published
   property Strings: TStrings read FStrings write SetStrings;
  end;

implementation
 
constructor TMyObject.Create;
begin
 inherited;
 FStrings := TStringlist.Create;
end;

destructor TMyObject.Destroy;
begin
 FStrings.Free;
 inherited;
end;

procedure TMyObject.SetStrings(Value: TStrings);
begin
 If Assigned(Value) then FStrings.Assign(Value);
end;
edit: fehler im code beseitigt

Hansa 20. Aug 2005 01:28

Re: Gibt TObject Speicherplatz wieder frei ?
 
Zitat:

Zitat von Dani
:shock: Wie kann man 5000 Beiträge in einem Delphi-Forum sammeln

Meinst Du damit mich oder vielleicht eher Luckie ? :lol: Was soll das finally denn da nützen ? Also gut : Du verwendest Destroy und Constructor/Destructor. Wie ich das sehe wird das free in ein Destroy umgebogen und das NIL bleibt außer acht. Was nun ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.
Seite 1 von 2  1 2      

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