AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TObjectList JsonToObject MemoryLeak
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList JsonToObject MemoryLeak

Ein Thema von ScharfeMietze · begonnen am 21. Okt 2020 · letzter Beitrag vom 21. Okt 2020
Antwort Antwort
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 09:02
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
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000

Registriert seit: 16. Dez 2005
Ort: NRW
232 Beiträge
 
Delphi 12 Athens
 
#2

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 09:05
Gibst du die FAnsagenliste wieder frei?
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 10:07
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
FAnsagenListe:= TObjectList<TAnsagen>.Create; Das scheint aber zuviel zu sein, lasse ich die Zeile beim Start weg, läuft es!
Bedeutet das bei FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text); zusätzlich noch eine Liste erstellt wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 10:36
Bedeutet das bei 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 FAnsagenListe:= TObjectList<TAnsagen>.Create; kannst du auch vor der Zuweisung ein Free aufrufen:
Delphi-Quellcode:
FAnsagenListe.Free;
FAnsagenListe := TJson.JsonToObject<TObjectList<TAnsagen>>(LsList.Text);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#5

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 11:17
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 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.
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 11:30
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#7

AW: TObjectList JsonToObject MemoryLeak

  Alt 21. Okt 2020, 13:25
Oh.. Danke sehr
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:09 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