Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Memory Leaks bei Verwendung von System.JSON (https://www.delphipraxis.net/203377-memory-leaks-bei-verwendung-von-system-json.html)

Der schöne Günther 4. Jun 2020 09:05

AW: Memory Leaks bei Verwendung von System.JSON
 
Was erwartest du?

Du lässt dir mittels
Delphi-Quellcode:
JsonValue := TJSonObject.ParseJSONValue(JsonString);
etwas erstellen und gibst es nie wieder frei.

Du musst das auch schon wieder freigeben.
Delphi-Quellcode:
  // create TJSonObject from string
  JsonValue := TJSonObject.ParseJSONValue(JsonString);
  if Assigned(JSonValue) then
     try

        // get the array
        JsonArray := JsonValue.GetValue<TJSONArray>('phones');

        // iterate the array
        for ArrayElement in JsonArray do begin
           if ArrayElement.GetValue<String>('name') = User then
           begin
            Result := ArrayElement.GetValue<boolean>(Field);
            break;
           end;
        end;
     finally
        JSonValue.Destroy();
     end;

freimatz 4. Jun 2020 09:54

AW: Memory Leaks bei Verwendung von System.JSON
 
Noch besser "JSonValue.Free();" statt "JSonValue.Destroy();"

Der schöne Günther 4. Jun 2020 10:08

AW: Memory Leaks bei Verwendung von System.JSON
 
Nein, warum? Es ist doch völlig klar dass die Variable nicht
Delphi-Quellcode:
nil
ist, also kann man sich die nochmalige Überprüfung auch sparen.

BastiFantasti 4. Jun 2020 10:37

AW: Memory Leaks bei Verwendung von System.JSON
 
allein das Json Objekt Freizugeben bringt nichts.
Hab ich auch schon versucht.

Delphi macht da intern so viele Unterobjekte (je nach Datenstruktur) und gibt die Teile aber nicht geregelt wieder frei wenn ich die JsonValue Variable freigebe.
JsonValue.free hatte ich drin, die Leaks waren dennoch da.

himitsu 4. Jun 2020 10:38

AW: Memory Leaks bei Verwendung von System.JSON
 
Das macht man nicht, weil

weil

na weil in de Hilfe steht, dass man Destroy nicht direkt aufruft, deswegen.

BastiFantasti 4. Jun 2020 10:42

AW: Memory Leaks bei Verwendung von System.JSON
 
ich hatte es mit .free drin.
FastMM hat aber dennoch ordentlich Leaks rausgeschrieben.

Ich teste nochmal
und ja, die destroy Methode rufe ich normal nicht direkt auf.
Normal FreeAndNil


Update:

jetzt habe ich es mit FreeAndNil freigegeben und jetzt scheint er gerade keinen Speicher mehr zu verschwenden.
Komisch ist, dass ich es vorher genau so hatte ...

BastiFantasti 4. Jun 2020 10:48

AW: Memory Leaks bei Verwendung von System.JSON
 
was genau besagt dieses FOwned Eigenschaft?

Vor dem Aufruf

Code:
  JsonValue := TJSonObject.ParseJSONValue(JsonString);
ist die JsonValue Variable nicht nil sonder schon vorhanden mit der Eigenschaft FOwned = False

im nächsten Schritt ist das Objekt an sich unverändert, jedoch steht FOwned = True drin...

BastiFantasti 4. Jun 2020 10:55

AW: Memory Leaks bei Verwendung von System.JSON
 
Also ich nehme alles zurück und behaupte das Gegenteil :-)

Mit dem FreeAndNil scheint es jetzt gerade zu funktionieren.
Evtl. hatte ich es vorher nicht komplett neu kompiliert oder wie auch immer.


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

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