... Stunden später ...
ne, die entscheidende Routine extrahiert und den Fehler gefunden. JSON ist schon sehr tückisch.
Der Fehler liegt hier:
AJSONObject.AddPair( AName + cXDataRef, AJSONObject.Values[ AName]);
Dort wird nicht der String des alten Feldes dem neuen Feld zugewiesen, sondern eine Referenz auf den Wert des alten Wertes. (!!)
Indem ich "AJSONObject.Values[ AName]" einsetze, setze ich nur einen Link.
Richtig wäre es:
Delphi-Quellcode:
var
tempStr: String;
begin
// vor dem Löschen
tempStr := AJSONObject.Values[ AName].Value;
AJSONObject.AddPair( AName + cXDataRef, tempStr);
Nun ist alles sauber. Kein Fehler und auch kein Memoryleak.
Also: Bei TJSONObject.RemovePair IMMER das gelöschte Pair freigeben! Aber sicher gehen, dass keine Referenz mehr auf dieses Pair existiert.
Danke. Uwe hat es erkannt.