Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variablen in Procedure freigeben. (https://www.delphipraxis.net/134306-variablen-procedure-freigeben.html)

Jackie1983 19. Mai 2009 16:34


Variablen in Procedure freigeben.
 
servus,

habe in meiner Anwendung irgend wie einen Speicherfresser.
Mache das zur Zeit so
Delphi-Quellcode:
Procedure MachWas(var data : TmeineKlasse);
begin
  //.. irgend was
  data.free;
end;

procedure Timer;
var
  data : TmeineKlasse;
begin
  data := TmeineKlasse.create;
  data.bla := bla;
  MachWas(data);
end;
da müste doch eigentlich die Daten freigegeben werden, oder?

Mfg

Jackie1983 19. Mai 2009 16:44

Re: Variablen in Procedure freigeben.
 
na super habe meinen Fehler gefunden......
Habe eine Procedure übergeben und da habe ich die Klasse nicht freigegeben....

oki 19. Mai 2009 16:56

Re: Variablen in Procedure freigeben.
 
Zitat:

Zitat von Jackie1983
na super habe meinen Fehler gefunden......
Habe eine Procedure übergeben und da habe ich die Klasse nicht freigegeben....

A: Da werd ich nicht draus schlau.
B: nach dem du das Objekt frei gegeben hast setze die Variable auf nil. Somit gibt es keinen Ärger, wenn du später auch mal prüfen willst, ob die Instanz frei gegeben wurde.

entweder:
Delphi-Quellcode:
  data.free;
  data := nil;
oder so:
Delphi-Quellcode:
  FreeAndNil(Data);
Gruß oki

thkerkmann 19. Mai 2009 19:05

Re: Variablen in Procedure freigeben.
 
und gib die Daten dort frei, wo du sie erstellt hast!!

Delphi-Quellcode:
Procedure MachWas(var data : TmeineKlasse);
begin
  //.. irgend was
  // data.free;
end;

procedure Timer;
var
  data : TmeineKlasse;
begin
  data := TmeineKlasse.create;
  data.bla := bla;
  MachWas(data);
  data.Free;
end;

Muetze1 19. Mai 2009 19:08

Re: Variablen in Procedure freigeben.
 
Und damit das ganze auch im - wie immer unwahrscheinlichen - Fehlerfall passiert, nutze try/finally:

Delphi-Quellcode:
procedure Timer;
var
  data : TmeineKlasse;
begin
  data := TmeineKlasse.create;
  try
    data.bla := bla;
    MachWas(data);
  finally
    data.Free;
  end;
end;

mjustin 19. Mai 2009 19:16

Re: Variablen in Procedure freigeben.
 
Oder benutze Schnittstellen, und aus diesem Code

Delphi-Quellcode:
procedure Timer;
var
  data : TmeineKlasse;
begin
  data := TmeineKlasse.create;
  try
    data.bla := bla;
    MachWas(data);
  finally
    data.Free;
  end;
end;
wird dieser, wieder etwas kompaktere, Code:

Delphi-Quellcode:
procedure Timer;
var
  Data: IMeinInterface;
begin
  Data := TMeineKlasse.Create;
  Data.Bla := Bla;
  MachWas(Data);
end;
Am Ende der Methode wird der Speicher automatisch wieder freigegeben - aber Vorsicht, wenn in MachWas eine Referenz auf das Data Objekt 'behalten' wird, kann es dennoch zu Speicherlecks kommen.

oki 19. Mai 2009 20:32

Re: Variablen in Procedure freigeben.
 
Zitat:

Zitat von thkerkmann
und gib die Daten dort frei, wo du sie erstellt hast!!

Ja, so das sollte man möglichst beachten. Dem Object ist es zwar egal, des guten Stiles, der Übersichtlichkeit und im eigenen Interesse sollte man sich daran halten.
Schau dir mal Muetzes Code an. Da sieht man auf einem Blick was mit dem Object passiert und kommt nicht ins grübeln ob und wann das Objekt frei gegeben wird/muss.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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