Einzelnen Beitrag anzeigen

Benutzerbild von DelphiBandit
DelphiBandit

Registriert seit: 19. Feb 2007
Ort: bei Walsrode
165 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: MemoryLeak (FastMM4) nach Befüllen einer Klasse aus JSON-String

  Alt 13. Nov 2014, 10:34
OK, 1) hätte ich Dir/Euch ersparen können
Zu 2) Ja, ist ja auskommentiert, weil es nach dem JSON-Load immer knallt. Ansonsten würde sich das Objekt sauber in Wohlgefallen auflösen.

Zu der Form-Variablen FEntryList - die wird nur mit dem "Free"-Button freigegeben. Also quasi auf Anforderung, weil ich dann besser debuggen konnte. "Load" und "Free" (Breakpoint) drücken, also quasi nach dem Motto "Jeder nur ein Kreuz!".

Bei mir in XE5 kommt der abstrakte Error in Generics.Collections beim Zuweisen von Capacity, in der Folge wohl die gleiche Stelle wie bei XE7:

Delphi-Quellcode:
procedure TList<T>.DeleteRange(AIndex, ACount: Integer);
var
  oldItems: array of T;
  tailCount, I: Integer;
begin
  if (AIndex < 0) or (ACount < 0) or (AIndex + ACount > Count)
    or (AIndex + ACount < 0) then
    raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
  if ACount = 0 then
    Exit;
  
  SetLength(oldItems, ACount);
  FArrayManager.Move(FItems, oldItems, AIndex, 0, ACount); // Die hier knallt
Ein normales .Free klappt ja auch ohne Speicherlecks, auch bei den Generics. Solange ich nicht zwischendrin das Ganze per REST.Json aus einer Datei habe laden lassen

Ich würde, um himitsu's Fußzeile herauszukramen, meinen Müll gerne wegräumen, wenn ich denn wüsste wie

populate
1) In btnPopulateSaveClick wird die lokale entryList nicht freigegeben
2) Der Destruktor von TEntryList gibt seine FEntryLists nicht frei

-> Kein LEck mehr beim fröhligen populieren


load
1) Du überschriebst das FEntryList-Feld deiner Form mit einer neuen Instanz ohne eine evtl
bereits bestehende freizugeben

Weiterhin gibt das Formular sein FEntryLists nicht frei. Damit sind wir bei deinem Punkt 2)

Woher der EAbstractError kommt verstehe ich auch nicht.


Keine Ahnung was da schief läuft. Jemand eine Idee?

Ein "normales" TObjectList<TEntries>.Create().Free(); klappt ja auch ohne Probleme. Ich hätte gedacht dass der Json-Mechanismus da irgendwie die TObjectList nicht richtig aufbaut...
Carsten
  Mit Zitat antworten Zitat