Moin,
ich verzweifle gerade an einem Memoryleak, bei dem ich nicht verstehe warum er entsteht. Und zwar habe ich folgende Funktion:
Delphi-Quellcode:
function TxxxManager.StringsToJSONArray(const Data: TStrings): TJSONArray;
var
i: Integer;
begin
Result := TJSONArray.Create;
for i := 0 to Data.Count - 1 do
begin
Result.Add(Data[i]);
end;
end;
Es handelt sich hierbei um eine ganz normale Funktion und keine Class-Function. Deleaker sagt mir jetzt dass in Zeile 5 und in Zeile 8 der Funktion jeweils ein Memoryleak sind (um genau zu sein durch die Objekte TJsonString, TJsonArray und TList<TJsonValue>).
Ich rufe diese Funktion aber über folgende Funktion auf:
Delphi-Quellcode:
function Global.Principals: TJSONArray;
var
mManager : TxxxManager;
mMandanten : TStringList;
begin
mManager := TxxxManager.Create;
try
mMandanten := TMandantRepository.GetMandantenMitKonzern(cKONZERN_XXX);
Result := mManager.StringsToJSONArray(mMandanten);
finally
FreeAndNil(mManager);
end;
end;
Was ich jetzt nicht verstehe. Ich gebe mManager wieder frei. Müsste er dann nicht auch die Resultvariable und Abhängigkeiten davon wieder freigeben oder habe ich da gerade ein Verständnisproblem? Bei Klassenfunktionen umgehe ich das Problem indem ich den Result in eine globale Variable kippe, die dann als Result übergebe und über den Klassendesturktor dann die globale Variable (die selbstverständlich private ist) wieder freigebe. Aber bei einer normalen Funktion müsste ich mir diesen Teil doch eigentlich schenken können, da doch bei FreeAndNil auch die Results wieder freigegeben werden. Zumindest hab ich das bisher so verstanden.
Könnte mir da vielleicht jemand weiter helfen? Ich komme ursprünglich aus dem C#-Umfeld und da hatten wir nen Garbage-Collector, der sich um das alles gekümmert hat. Daher fehlen mir hier grad so ein wenig die Basics in der Speicherverwaltung, weil das ein Thema war, welches ich vor Delphi nicht berücksichtigen musste.
Vielen Dank schon einmal im Voraus.
Viele Grüße
Maliko