![]() |
Zugriffsverletzung beim TObjectDictionary.Add
Hallöle...:P
Ich verstehe die Welt nicht mehr...:roll:
Delphi-Quellcode:
TUserRoleRightDict = TObjectDictionary<Integer, TUserRoleRight>;
... UserRight := TUserRoleRight.Create; UserRight.RightID := StrToInt(ContentList[0]); ... FModifiedUserRole.RoleRightList.Add(UserRight); FModifiedUserRole.RoleRightDict.Add(UserRight.RightID, UserRight); Zitat:
PS: Die Liste enthällt das korrekte Objekt. Danke für Infos...:wink: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Ich tipp mal auf nen falschen Konstruktoraufruf durch die ganzen Overloads beim TDictionary, so dass FComparer nil ist. :glaskugel:
Was sonst soll ne AV beim Lesen von Adresse 00000000 in der Methode Hash verursachen :gruebel: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
RoleRightDict.Create, statt RoleRightDict := TUserRoleRightDict.Create?
Zeig uns doch mal den Code wo das Dictionary erstellt wird. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Bitteschön...:P
Delphi-Quellcode:
Wer meinen dusslichen Fehler findet...dem gebe ich ein :cheers: aus...
FRoleRightDict := TUserRoleRightDict.Create; // Dict ohne Freigabe (sortierte Liste RoleRightList)
FRoleRightList := TUserRoleRightList.Create; // List gibt Objekte frei ... FRoleRightDict := TUserRoleRightDict.Create([doOwnsValues]); // gleicher Fehler FRoleRightList := TUserRoleRightList.Create(False); Nachtrag: FComparer ist nil. :shock: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
- Stoppunkt nach dem Create und schauen, ob FRoleRightDict.FComparer assigned ist.
- Schauen, ob es nicht aus Versehen irgendwo freigegeben wird bevor der Add Aufruf passiert. P.S. Ich glaub, ich mach mal für die Forentage 2020 einen "Fehleranalyse 101" Vortrag 8-) |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Ich verwende Dictionaries ständig. Einen Comparer habe ich noch nie benutzt. Ich erstelle die Instanz wie immer meistens mit [doOwnsValues]. Danke... Nachtrag: * Nach dem Create ist der Comparer Assigned (Pointer($3BFEF6C) as {System.Generics.Defaults}IEqualityComparer<System .Integer>) * vor dem Add ist der Comparer Assigned (nil) -> dazwischen passiert mit dem Dict nix. Das Dict wird erzeugt und dann beschrieben. :? Eine Idee habe ich noch...aber erst morgen früh. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Es geht nur darum, dass wenn bestimmte grundlegenden Dinge schon vorab passiert sind (und das ist nun keineswegs nur auf dich und diesen Fall bezogen) man entweder schon selbst drauf kommt oder es anderen erleichtert, Hilfe zu leisten. Das ist glaube ich, im Interesse aller. Ist wie mit dem Fisch geben oder Angeln beibringen. Klar, wenn man keine Lust oder Zeit auf Angeln hat, kann man auch andere nach nem Fisch fragen (oder man kauft ihn im Supermarkt) :roll: Punkt ist, dass man keinen comparer angeben muss, der wird intern gebaut/bezogen. Wenn der also plötzlich nil ist, kann es sich nur um Vorzeitiges Freigeben des Dictionaries handeln oder was ich eher für unwahrscheinlich halte Speicherüberschreiben dieses Objekts durch eine andere Stelle. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Und was ist "TSEAMUserRoleRightDict"? Ist das immer noch ein Alias? Oder eine eigene Unterklasse welche z.B. nur "inherited" oder "inherited Create" im Konstruktor sagt?
Ein Codeschnippsel zum Nachstellen wäre echt super-hilfreich. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
TSEAMUserRoleRightDict war ein Tippfehler.
Korrekt wäre wie in den Codeschnippseln TUserRoleRightDict. Danke... |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Moin...8-)
Zitat:
Danke für eure Hilfe. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Objektkopie?
Hat das Objekt ein "Assign", oder wie genau?
Delphi-Quellcode:
Für den höchst unwahrscheinlichen Fall, dass du das meintest.
StringList1 := TStringList.Create();
StringList2 := StringList1; StringList1.Free(); StringList2.Add('Something'); // <- Alles Kaputt, so geht das natürlich nicht! |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Delphi-Quellcode:
...nur leider funktioniert das nicht immer. :( Wie man an dem o.g. Fehler erkennen kann, werden Dictioniaries nicht wieder richtig erzeugt. Ich habe deshalb wieder nur auf Liste umgestellt.
class function TToolsJson.ObjectCopyJson(Value: TObject): TObject;
var MarshalObj: TJSONMarshal; UnMarshalObj: TJSONUnMarshal; JSONValue: TJSONValue; begin Result := nil; MarshalObj := TJSONMarshal.Create; try UnMarshalObj := TJSONUnMarshal.Create; try JSONValue := MarshalObj.Marshal(Value); try if Assigned(JSONValue) then Result := UnMarshalObj.Unmarshal(JSONValue); finally JSONValue.Free; end; finally UnMarshalObj.Free; end; finally MarshalObj.Free; end; end; |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Siehe auch hier: ![]() |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Sowas geht auch nur ansatzweise?
Ich hätte gesagt, da es sich ja nur um den Typen "TObject" handelt, weiß Delphi eh nicht, was zu tun ist und stellt nur irgendeinen Mist her. Ich bin total verwirrt! Das ist für mich schon quasi EDV-Magie! :oops: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
|
AW: Zugriffsverletzung beim TObjectDictionary.Add
Moin...:P
Zitat:
Delphi-Quellcode:
BlubbCopy := TBlubb(TTools.ObjectCopy(Blubb));
|
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Ähnlich wie bei den Values, kann auch der KEY owned werden. |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Danke...:wink: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
|
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
|
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
Lösung kann auch so aussehen:
Delphi-Quellcode:
Dann ruft das JSON dings den richtigen ctor auf.
TUserRoleRightDict = class(TObjectDictionary<Integer, TUserRoleRight>)
constructor Create; overload; end; constructor TUserRoleRightDict.Create; begin inherited Create; end; P.S. Das Problem wird übrigens auch bei TObjectList<T> passieren. Denn dann wird der parameterlose ctor von TList<T> aufgerufen und dann bleibt FOwnsObjects auf false. Nur als Hinweis, falls mal irgendwo massive Leaks auftreten. :wink: |
AW: Zugriffsverletzung beim TObjectDictionary.Add
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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