Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TObjectList JsonToObject MemoryLeak (https://www.delphipraxis.net/205828-tobjectlist-jsontoobject-memoryleak.html)

ScharfeMietze 21. Okt 2020 08:02

TObjectList JsonToObject MemoryLeak
 
Delphi-Quellcode:
var
  LsList: TStringList;
begin
LsList := TStringList.Create;
  try
    LsList.LoadFromFile(FPath + DataFileName);
    FShadowData:= LsList.Text;
    FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text); //memory Leak
    FillAnsagenListe;
  finally
    LsList.Free;
  end; // try
end;
Hallo, Ich habe eine Frage, mir reißt es durch diese Zeile ein MemoryLeak. Das wird mir beim schließen (ReportMemoryLeaksOnShutdown) angezeigt.
Der Code tut zwar was er soll und es ist auch bei dem Tool an sich zu verschmerzen, aber ich würde gerne in Zukunft weiter damit arbeiten.
Frage: Wie muss der Code aussehen damit ich kein Memoryleak bekomme?
Dank euch :)

t2000 21. Okt 2020 08:05

AW: TObjectList JsonToObject MemoryLeak
 
Gibst du die FAnsagenliste wieder frei?

ScharfeMietze 21. Okt 2020 09:07

AW: TObjectList JsonToObject MemoryLeak
 
Ja, die Liste wird beim close freigegeben.

Delphi-Quellcode:
begin
if Assigned(FAnsagenListe) then FAnsagenListe.Free;
ReportMemoryLeaksOnShutdown:= True;
end
AHHHHHHHHHHber du hast mich auf die Lösung gebracht! Vielen Dank!!!
Das Problem war nicht das freigeben. Sondern das ich brav und artig wie immer diese Liste beim Start "created" habe.
mit
Delphi-Quellcode:
FAnsagenListe:= TObjectList<TAnsagen>.Create;
Das scheint aber zuviel zu sein, lasse ich die Zeile beim Start weg, läuft es!
Bedeutet das bei
Delphi-Quellcode:
FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text);
zusätzlich noch eine Liste erstellt wurde.

Uwe Raabe 21. Okt 2020 09:36

AW: TObjectList JsonToObject MemoryLeak
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1475863)
Bedeutet das bei
Delphi-Quellcode:
FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text);
zusätzlich noch eine Liste erstellt wurde.

Ja, das ist in der Tat so. Durch die Zuweisung wird die Variable neu gesetzt und die ursprüngliche Instanz wird zu einer Speicherleiche.

Alternativ zum Weglassen des
Delphi-Quellcode:
FAnsagenListe:= TObjectList<TAnsagen>.Create;
kannst du auch vor der Zuweisung ein Free aufrufen:
Delphi-Quellcode:
FAnsagenListe.Free;
FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text);

ScharfeMietze 21. Okt 2020 10:17

AW: TObjectList JsonToObject MemoryLeak
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1475868)
Ja, das ist in der Tat so. Durch die Zuweisung wird die Variable neu gesetzt und die ursprüngliche Instanz wird zu einer Speicherleiche.

Alternativ zum Weglassen des
Delphi-Quellcode:
FAnsagenListe:= TObjectList<TAnsagen>.Create;
kannst du auch vor der Zuweisung ein Free aufrufen:
Delphi-Quellcode:
FAnsagenListe.Free;
FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text);

Ja, behelfe mir so beim Laden, da die Liste ggf neu geladen werden muss falls die gespeicherte Datei (inzwischen der Eingabe) von einem anderen Ort geändert wurde.
Delphi-Quellcode:
if Assigned(FAnsagenListe) then FAnsagenListe.Free;
Das Arbeiten mit Json und dem einfachen "draufklatschen" auf ein Objekt ist eine herrliche Sache. Ich liebe es!
Gruß und Dank
Eure
ScharfeMieze

Uwe Raabe 21. Okt 2020 10:30

AW: TObjectList JsonToObject MemoryLeak
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1475871)
Delphi-Quellcode:
if Assigned(FAnsagenListe) then FAnsagenListe.Free;

Die Abfrage auf Assigned ist überflüssig, da das direkt in Free abgefangen wird:
Delphi-Quellcode:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

ScharfeMietze 21. Okt 2020 12:25

AW: TObjectList JsonToObject MemoryLeak
 
Oh.. Danke sehr :)


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