![]() |
Memory Leak bei TJsonObject
Hallo Zusammen,
das Problem vorab: beim Zuweisen von
Delphi-Quellcode:
entsteht ein Memory Leak.
LResponse
Über die folgende Methode rufe ich per indy ein JSON response ab. Der Inhalt ist ein neues Token welches abgelaufen ist ab. Es funktioniert einwandfrei. Wenn ich jedoch die Anwendung beende, wird ein Memory Leak signalisiert da ich
Delphi-Quellcode:
in der Projektdatei aktiviert habe.
Application.MainFormOnTaskbar := True;
Ich habe Schrittweise alles auskommentiert und die Stelle lokalisieren können die dafür verantwortlich ist. Es ist die Zuweisung von
Delphi-Quellcode:
LResponse
Delphi-Quellcode:
Was mache ich falsch?
procedure TdmCleverReach.RefreshToken;
var LResponse: TJsonObject; LResponseStream: TBytesStream; FormData: TidMultiPartFormDataStream; begin Formdata := TIdMultiPartFormDataStream.Create; Formdata.AddFormField('grant_type', 'refresh_token'); Formdata.AddFormField('refresh_token', INIRefreshToken); Formdata.AddFormField('client_id', INIClientID); Formdata.AddFormField('client_secret', INIClientSecret); FormData.Position := 0; LResponseStream := TBytesStream.Create; LResponse := TJsonObject.Create; try IdhttpToken.Request.CustomHeaders.Clear; IdhttpToken.Request.CustomHeaders.AddPair('Content-Type','multipart/form-data'); try IdhttpToken.Post(INITokenURL,FormData,LResponseStream); LResponseStream.Position := 0; //Hier scheint der Memory Leak zu entstehen, aber warum? >>>> LResponse := TJsonObject.ParseJSONValue(LResponseStream.Bytes, 0, LResponseStream.Size) as TJsonObject; LResponseStream.SaveToFile(PrgPath + '\ResponseStream.JSON'); finally Formdata.Free; LResponse.Free; LResponseStream.Free; end; end; Gruß Kostas |
AW: Memory Leak bei TJsonObject
Zitat:
Delphi-Quellcode:
Die hier erzeugte Instanz wird nie verwendet und auch nie freigegeben.
procedure TdmCleverReach.RefreshToken;
var LResponse: TJsonObject; LResponseStream: TBytesStream; FormData: TidMultiPartFormDataStream; begin Formdata := TIdMultiPartFormDataStream.Create; Formdata.AddFormField('grant_type', 'refresh_token'); Formdata.AddFormField('refresh_token', INIRefreshToken); Formdata.AddFormField('client_id', INIClientID); Formdata.AddFormField('client_secret', INIClientSecret); FormData.Position := 0; LResponseStream := TBytesStream.Create; LResponse := TJsonObject.Create; Weiter unten überrschreibt dein Kode
Delphi-Quellcode:
das Objekt.
LResponse := TJsonObject.ParseJSONValue(LResponseStream.Bytes, 0, LResponseStream.Size) as TJsonObject;
|
AW: Memory Leak bei TJsonObject
oh, genau das habe ich übersehen dass ParseJSONValue ein neues Object erzeugt.
herzlichen Dank. |
AW: Memory Leak bei TJsonObject
Und jetzt sag blos, dass es dir der Compiler nicht vorher gesagt hat?
|
AW: Memory Leak bei TJsonObject
Nein, von Compiler habe ich keine Warnung oder Hinweis bekommen.
Ist das einstellbar in den Optionen? Gruß Kostas |
AW: Memory Leak bei TJsonObject
Zitat:
|
AW: Memory Leak bei TJsonObject
In der Tat ... entweder musst du vor der neu-Zuweisung das "alte" Objekt freigeben, oder du ziehst das Free aus dem unteren finally weiter nach oben.
Delphi-Quellcode:
procedure TdmCleverReach.RefreshToken;
var LResponse: TJsonObject; LResponseStream: TBytesStream; FormData: TidMultiPartFormDataStream; begin Formdata := TIdMultiPartFormDataStream.Create; Formdata.AddFormField('grant_type', 'refresh_token'); Formdata.AddFormField('refresh_token', INIRefreshToken); Formdata.AddFormField('client_id', INIClientID); Formdata.AddFormField('client_secret', INIClientSecret); FormData.Position := 0; LResponseStream := TBytesStream.Create; try IdhttpToken.Request.CustomHeaders.Clear; IdhttpToken.Request.CustomHeaders.AddPair('Content-Type','multipart/form-data'); try IdhttpToken.Post(INITokenURL,FormData,LResponseStream); LResponseStream.Position := 0; //Hier scheint der Memory Leak zu entstehen, aber warum? LResponse := TJsonObject.ParseJSONValue(LResponseStream.Bytes, 0, LResponseStream.Size) as TJsonObject; try // whatever finally LResponse.Free; end; LResponseStream.SaveToFile(PrgPath + '\ResponseStream.JSON'); finally // ... end; finally Formdata.Free; LResponseStream.Free; end; end; |
AW: Memory Leak bei TJsonObject
Delphi-Quellcode:
Da genügt dann ein Ressourcenschutzblock.
LResponse := nil;
try ... LResponse := TJsonObject.ParseJSONValue(LResponseStream.Bytes, 0, LResponseStream.Size) as TJsonObject; finally LResponse.Free; ... end; |
AW: Memory Leak bei TJsonObject
Zitat:
allerdings sollte bei der zweiten Zuweisung eigentlich eine Warnung kommen, denn ohne knallen würde der erste Wert niemals verwendet. |
AW: Memory Leak bei TJsonObject
LResponse wird vorher NICHT erzeugt!
So habe ich es jetzt umgesetzt.
Delphi-Quellcode:
Vielen lieben Dank und frohe Weihnachten an alle.
try
LResponse := TJsonObject.ParseJSONValue(LResponseStream.Bytes, 0, LResponseStream.Size) as TJsonObject; if Assigned(LResponse) then begin LResponse.TryGetValue<String>('access_token', access_token); LResponse.TryGetValue<String>('refresh_token', refresh_token); LResponse.TryGetValue<integer>('expires_in', expires_in); LResponse.Free; end; except // Fehlerbehandlung. end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr. |
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