Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi FastIniFiles Memory Leaks (https://www.delphipraxis.net/143732-fastinifiles-memory-leaks.html)

himitsu 22. Nov 2009 10:33

Re: FastIniFiles Memory Leaks
 
man kann das mit With machen, aber man sollte schon den richtigen Desktructor nutzen

Zitat:

Zitat von API
@hoika: auch nach ändern durch inherited Destroy; geht der Leak nicht weg.

man überschreibt nicht Free, sondern Destroy



Delphi-Quellcode:
destructor TFIniSection.Destroy; // in der Definition mit OVERRIDE;
var
  i: Integer;
begin
  Name := '';
  Finalize(Values);
  inherited;
end;

hoika 22. Nov 2009 10:40

Re: FastIniFiles Memory Leaks
 
Hallo,

Free wird zwar aufgerufen,
der Destructor heisst aber Destroy.

Mit dem with stimmt wie oben.

Was spricht gegeben

FIniFile:=
with FIniFile

Ausserdem verstehe ich nicht,
warum man heutzutage noch IniFiles benutzt ...


Heiko

hoika 22. Nov 2009 10:42

Re: FastIniFiles Memory Leaks
 
Hallo,

zeig doch noch mal den Leak-Code (fastmm).


Heiko

API 22. Nov 2009 11:08

Re: FastIniFiles Memory Leaks
 
Zitat:

Zitat von hoika
Hallo,
zeig doch noch mal den Leak-Code (fastmm).
Heiko

http://codepaste.net/78msi9

hoika 22. Nov 2009 11:40

Re: FastIniFiles Memory Leaks
 
Hallo,

hast du die unit überarbeitet (Free->Destroy override) ?

Der Programmierer der Unit hat die leaks "eingebaut".



Heiko

jfheins 22. Nov 2009 11:58

Re: FastIniFiles Memory Leaks
 
FastIniFile + MemeoryLeak :arrow: http://en.wikipedia.org/wiki/Space-time_tradeoff :mrgreen:

Klaus01 22. Nov 2009 12:10

Re: FastIniFiles Memory Leaks
 
Delphi-Quellcode:
  TFIniEntry = class
    public
      // Markiert den Wert zum löschen, d.h. er wird nicht geschrieben
      Deleted: Boolean;
      constructor Create;
  end;

  TFIniFile = class
    private
      // Sektionen in der Datei
      Entries: array of TFIniEntry;
      // Index der geöffneten Sektion
      CurrentSection: Integer;
Delphi-Quellcode:
destructor TFIniFile.Free(SaveChanges: Boolean = true);
begin
  if isChanged and SaveChanges then Save;
  Finalize(Entries);
  inherited Destroy;
end;
Ich denke, dass Finalize nur das dyn Array dereferenziert aber
nicht die Instanzen von TFIniEntry freigibt.
Dazu müßte vorher durch das Array iteriert werden und die Instanzen
freigeben werden.

Grüße
Klaus

hoika 22. Nov 2009 12:17

Re: FastIniFiles Memory Leaks
 
Hallo,

Einspruch.

Lese ich mir die Hilfe zu Finalize durch,
macht sie genau so, was sie soll.

Aber ein
Entries.Dispose;

geht hier doch auch ?

Noch mal die Frage an den TE,
hast du Free durch Destroy ersetzt ?


Heiko

hoika 22. Nov 2009 12:33

Re: FastIniFiles Memory Leaks
 
Hallo,

Die Memleaks sind bei

1.
Delphi-Quellcode:
SetLength(Values, Length(Values)+1);
Values[High(Values)] := TFIniValue.Create(Buf1, Buf2);
und 2. bei
Delphi-Quellcode:
SetLength(Entries, Length(Entries)+1);
Entries[High(Entries)] := TFIniSection.Create(Buf);
Warum, darf der Programmierer selber rausfinden.
Ich klink mich aus.


Heiko

himitsu 22. Nov 2009 13:01

Re: FastIniFiles Memory Leaks
 
Joar, man könnte auch die schonmal gestellte Frage aufwerfen:
Warum unbedingt INI?

PS: TMemIniFile und andere schnellere Ini-Varianten gibt es notfalls auch noch.

PSS: Finalize gibt nur das Array, aber nicht die darin enthaltenen Objekte frei.
Finalize gibt allgemein keine Objekte/Pointer frei, sondern nur Strings, DynArrays und Interfaces.

Und wenn ich mir diese Unit so ansehe, dann werden alle intern erstellten Objekte niemals freigegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz