AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FastIniFiles Memory Leaks

Ein Thema von API · begonnen am 22. Nov 2009 · letzter Beitrag vom 19. Feb 2010
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#1

FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 08:14
Hallo

Bin auf FastIniFiles (http://home.arcor.de/smartprog4u/) umgestiegen weil es ein paar nette Funktionen bietet und schneller läuft.
Das Problem: Beim Beenden des Programms gibt es Memory Leaks.

Testcode:

Delphi-Quellcode:
uses
 FastIniFiles;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TFIniFile.Create('C:\...\test.ini') do
  try
  (*........*)
  finally
    Free;
  end;
end;
Leaks:

Zitat:
----------------------------------------------------------------------------
|+Memory Leak: Type=Data; Total size=32; Count=2 |
|--------------------------------------------------------------------------|
|004AD2E6|Project1.exe|FastIniFiles.pas|TFIniFile| Create |346[92] |
|004AD2FC|Project1.exe|FastIniFiles.pas|TFIniFile| Create |347[93] |
|--------------------------------------------------------------------------|
| |
|+Memory Leak: Type=TFIniValue; Total size=32; Count=2 |
|--------------------------------------------------------------------------|
|004AD361|Project1.exe|FastIniFiles.pas|TFIniFile| Create |354[100]|
|004ACF13|Project1.exe|FastIniFiles.pas|TFIniFile| Create |243[9] |
----------------------------------------------------------------------------
Ein Leak soll gem. Anzeige oben hier auftreten:
Delphi-Quellcode:
constructor TFIniFile.Create(const FileName: string; CommentChar: Char = '#');
var
  Stream: TStream;
begin
  //...
  Self := Create(Stream);
  Stream.Free;
end;
Warum denn? Das Ini File wird ja wieder freigegeben und sobit der Stream auch??

Zudem gibt es noch etliche andere Leaks. Vermutlich in den Destruktoren. Wer findet noch welche?

Genügt z.B das Finalize oder braucht es noch ein for i := Low(Values) to High(Values) do Values[i].Free; ?

Delphi-Quellcode:
destructor TFIniSection.Free;
var
 i: Integer;
begin
  Name := '';
  Finalize(Values);
  inherited Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 09:29
Hallo API,

ich kenne jetzt nicht FastIniFiles, aber ich könnte mir vorstellen wenn es sich um eine Class handelt, dass man sie nicht mit free freigibt, sondern mit destory.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 10:17
.Free ist ein Prozedur, die auf <>nil prüft und dann destroy aufruft, .Free ist also mindestens equivalent, wenn nicht gar vorzuziehen ggü. destroy
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 10:45
Hallo,

wer programmiert denn so schlimm

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  FIniFile: TFIniFile;
begin
  FIniFile:= TFIniFile.Create('C:\...\test.ini');
  try
  finally
    FIniFile.Free;
  end;
end;
oder mit dem with
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with TFIniFile.Create('C:\...\test.ini') do
  begin
    try
    (*........*)
    finally
      Free;
    end;
  end;
end;
Schönes Bsp., wie man sich mit with Probleme bereiten kann
(liegt aber nicht am with, sondern an der Programmierung).

Delphi-Quellcode:
constructor TFIniFile.Create(const FileName: string; CommentChar: Char = '#');
var
  Stream: TStream;
begin
  //...
  Create(Stream);
  Stream.Free;
end;

Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 10:49
Ich glaube eher es liegt hier: Self := Create(Stream);

Das passiert eigentlich implizit im constructor - mit anderen Worten: Es wird ein Objekt erstellt, an Self zugewiesen und dann der Kontruktor aufgerufen. Wenn der jetzt noch ein Objekt erstellt und wieder an Self zuweist dann geht jede Referenz auf das erste verloren, aber der Speicher wird nicht freigegeben.
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#6

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 11:08
Zitat von jfheins:
Ich glaube eher es liegt hier: Self := Create(Stream);

Das passiert eigentlich implizit im constructor - mit anderen Worten: Es wird ein Objekt erstellt, an Self zugewiesen und dann der Kontruktor aufgerufen. Wenn der jetzt noch ein Objekt erstellt und wieder an Self zuweist dann geht jede Referenz auf das erste verloren, aber der Speicher wird nicht freigegeben.
Wie kann man das beheben?

@hoika: Was ist denn daran falsch?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  FIniFile: TFIniFile;
begin
  FIniFile:= TFIniFile.Create('C:\...\test.ini');
  try
  finally
    FIniFile.Free;
  end;
end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 11:13
Hallo,


Delphi-Quellcode:
destructor TFIniSection.Free;
var
i: Integer;
begin
  Name := '';
  Finalize(Values);
  inherited Free;
end;
Delphi-Quellcode:
destructor TFIniSection.Destroy;
var
i: Integer;
begin
  Name := '';
  Finalize(Values);
  inherited Destroy;
end;



Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#8

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 11:21
Delphi-Quellcode:
destructor TObject.Destroy;
procedure TObject.Free;
Destroy ist der Destructor !

Und beim Destructor nie das Override vergessen !
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#9

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 11:23
@hoika: Bei beiden Varianten wird der
destructor TFIniFile.Free(SaveChanges: Boolean = true); aufgerufen.

Zudem: Warum kann man das nicht mit with machen? Danach muss überall ein FIniFile. geschrieben werden, der Code wird unschön (/größer)

Delphi-Quellcode:
var
  FIniFile: TFIniFile;
begin
  FIniFile:= TFIniFile.Create('C:\...\test.ini');
  try
    if FIniFile.SectionExists('Section') then
    begin
      FIniFile.EnterSection;
      ... := FIniFile.ReadString('Value1');
    end;
    FIniFile....
    FIniFile.....
    FIniFile.... usw..
  finally
    FIniFile.Free;
  end;
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#10

Re: FastIniFiles Memory Leaks

  Alt 22. Nov 2009, 11:28
Zitat von himitsu:
Delphi-Quellcode:
destructor TObject.Destroy;
procedure TObject.Free;
Destroy ist der Destructor !

Und beim Destructor nie das Override vergessen !
Nach hinzufügen des override kommt aber eine Fehlermeldung.

[Error] FastIniFiles.pas(77): Cannot override a static

@hoika: auch nach ändern durch inherited Destroy; geht der Leak nicht weg.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 14: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