![]() |
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
|
AW: Verständnisfrage: TJSONObject create/free/destroy?
Delphi-Quellcode:
Mit dem AddPair bekommt das json das jsonArr ja übergeben. Wegen Owned := False gibt es das in seinem Destroy zwar nicht frei, aber reagiert doch verschnupft, wenn es jemand außerhalb freigibt ohne ihm das vorher durch ein RemovePair mitzuteilen.
try
jsonArr:= TJSONArray.Create; jsonArr.owned:=false; jsonArr.Add(p1); jsonArr.Add(p2); json.AddPair('path', jsonArr); |
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
Es geht seine Child-Liste durch und will bei dem JsonArr nachsehn, was im .Owned drin steht, also ob es das freigeben soll, oder nicht. Frage ist jetzt nur, warum Eba vergessen hat bei Freigabe von TJSONArray in dessen Owner sich aus der Liste auszutragen. z.B. bei TObjektList steht das "Owned" im Owner und nicht in jedem Child ... Er guckt also nur in sich selbst nach, ob es freigeben soll, somit kann ihm dort egal sein, ob die Child-Objekte noch existieren, weil es nicht da drauf zugreifen muß. |
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
Und damit auch schon ein MemLeak behoben in einer Komponente (PageExtControl, die ich sehr gerne verwende (da wurde TTabColors im destroy nicht wieder freigegeben, aber das nur nebenbei)). Mit FastMM habe ich jetzt aber ein ganz neues unerklärliches Problem :pale:
Delphi-Quellcode:
Bei dem sl.free hüpft FastMM dann in seine Funktion DebugFreeMem und kreiselt dort herum.
procedure OpenGrid(var Grid:TStringGrid;Filename:string;Separator:AnsiChar);
var sl:TSTringList; begin try sl:=TStringList.Create; sl.LoadFromFile(Filename); //mache was damit finally sl.Free end; end; Es kehrt danach nicht mehr in meine Procedure zurück, in der ich OpenGrid aufgerufen habe... :pale: Hat das FastMM da einen Bug (auch wenn das in der beiliegenden readme ausgeschlossen wird)? Ich dachte FastMM soll helfen und keine neuen Bugs produzieren!? |
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
Ich hab jetzt alle Freigaben und das Owned entfernt und gebe ganz zum Schluss nur das json.free Jetzt schaue ich mir an, was FastMM dazu entdeckt, wie mir Himitsu empfohlen hat. Und je, irgendwie ist das mit dem TJSONObject trotzdem nicht gut :roll: - ich habe die Funktion damit nur 1x aufgerufen und Auszug:
Code:
Offenbar gibt TJSON das nicht so frei, wie wir uns es erhofft haben.
13 - 20 bytes: TJSONNumber x 2, TJSONObject x 2, TJSONString x 10, TJSONPair x 6, Unknown x 1
|
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
|
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
|
AW: Verständnisfrage: TJSONObject create/free/destroy?
Zitat:
Aber es ändert nichts am Verhalten vom FastMM - Es wirft mir eine Exception - Zugriffverletzung bei Adresse... und wenn ich dort schaue, mitten im CPU-Fenster ist es in "@UStrAsg" :gruebel: Weiß nicht, was das ist... irgendwas mit UniCodeString in der Nähe - "Lesen von Adresse 8B2E2583". Kommentiere ich die Unit FastMM aus, gibt es keinen Fehler. |
AW: Verständnisfrage: TJSONObject create/free/destroy?
[edit]
im Stacktrace nachschauen, was vor dem UStrAsg war? UStrAsg ist z.B. ein
Delphi-Quellcode:
StringVariable1 := StringVariable2;
[/edit] Zitat:
Erst nach "erfolgreichem" Create ist SL zugewiesen und Free kann auch wirklich was tun. Alternativ kann man vor dem Try auch ein
Delphi-Quellcode:
einfügen, dann hat SL beim Free auch einen gültigen Wert, selbst wenn es im oder schon vorm Create knallt.
SL:=nil;
Und warum hört eigentlich nie jemand auf den Compiler, denn der sagt doch bestimmt, dass da was falsch ist. :roll: Aber da es hier extrem unwahrscheinlich ist (außer das Programm war vorher schon im Arsch), dass hier das Create knallen würde, müßte Create bereits vorbei sein und es hatte danach geknallt. Wenn es da also im Free abraucht, dann liegt es nicht am "ungültigen" SL, sonder würde eher z.B. für einen Bufferoverrun oder zerschossenen Stack sprechen ... so oder so ist da eh alles im A und alles Weitere wäre sinnlos. Auch wenn es möglich wäre, ist es schon etwas unwahrscheinlich, dass es "wegen" FastMM knallt. Eher war vorher schon ein Fehler da, der jetzt nur noch besser auffällt. |
AW: Verständnisfrage: TJSONObject create/free/destroy?
Ja, da hast du recht, mein Code ist schon ein wenig hingeschmiert :oops:
Ich habe es schon fast vergessen gehabt, daß da noch was war mit... - wenn man ältere Quelltexte verwendet und Delphi zwischenzeitlich "String" als UnicodeString versteht, ich aber weiterhin in AnsiString denke. Also habe ich im alten Code nun alles, was Char und String hieß, spezifiziert (char -> AnsiChar; String -> AnsiString; leider geht es bei AnsiString jetzt nicht mehr mit .toInteger -> strtoint() ... Und ich habe bei dem, was ich nach dem Laden der SL getan habe, auch noch eine Sonderbehandlung eingebaut .. und jetzt knallt es dort nicht mehr. :thumb: Kann ich Delphi dazu bringen, das String als AnsiString zu verstehen statt alles mit dem blöden UnicodeString zu machen? Viele Leaks werden auch in den Indy-Typen gemeldet. Und haufenweise bei UnicodeString. Ich habe neben den system.TJSON auch eine Unit TdJSON ( ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 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