Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zugriffsverletzung beim TObjectDictionary.Add (https://www.delphipraxis.net/202195-zugriffsverletzung-beim-tobjectdictionary-add.html)

haentschman 8. Okt 2019 15:23

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:

...
exception message : Zugriffsverletzung bei Adresse 0167C71D in Modul '.exe'. Lesen von Adresse 00000000.
...
main thread ($2f88):
0167c71d +015 .exe SEAM.Classes.Data 6239 +4 {System.Generics.Collections}TDictionary<System.In teger,Classes.Data.TUserRoleRight>.Hash
0167cefb +02b .exe SEAM.Classes.Data 6347 +4 {System.Generics.Collections}TDictionary<System.In teger,.Classes.Data.TUserRoleRight>.Add
0368b635 +211 .exe Form.UserManager.Logic 329 +28 CreateNewRole
0368b6c0 +008 .exe Form.UserManager.Logic 334 +1 TUserManager.UserRoleAdd
0368fc26 +082 .exe Form.UserManager 1079 +7 TfoUserManager.gtvUserRoleNavigatorButtonsButtonCl ick
...
PS: Das TObjectDictionary ist instanziert. Allerdings ohne Objektfreigabe. Die Freigabe wird über eine sortierte Liste mit diesen Objekten realisiert. Im Prinzip enthällt das Dict die Objekte nur besser zum Suchen.
PS: Die Liste enthällt das korrekte Objekt.

Danke für Infos...:wink:

Stevie 8. Okt 2019 15:36

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:

Neutral General 8. Okt 2019 15:37

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
RoleRightDict.Create, statt RoleRightDict := TUserRoleRightDict.Create?

Zeig uns doch mal den Code wo das Dictionary erstellt wird.

haentschman 8. Okt 2019 15:42

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Bitteschön...:P
Delphi-Quellcode:
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);
Wer meinen dusslichen Fehler findet...dem gebe ich ein :cheers: aus...

Nachtrag: FComparer ist nil. :shock:

Stevie 8. Okt 2019 16:01

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-)

haentschman 8. Okt 2019 16:22

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Ich glaub, ich mach mal für die Forentage 2020 einen "Fehleranalyse 101" Vortrag
...Danke für die aufbauenden Worte. :? Kannst du dir vorstellen, daß ich für das Debuggen von "Bibliotheken" keinen Nerv/Zeit habe?

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.

Stevie 8. Okt 2019 16:40

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Zitat von haentschman (Beitrag 1449303)
Zitat:

Ich glaub, ich mach mal für die Forentage 2020 einen "Fehleranalyse 101" Vortrag
...Danke für die aufbauenden Worte. :? Kannst du dir vorstellen, daß ich für das Debuggen von "Bibliotheken" keinen Nerv/Zeit habe?

Ich verwende Dictionaries ständig. Einen Comparer habe ich noch nie benutzt. Ich erstelle die Instanz wie immer meistens mit [doOwnsValues].

Danke...

Hilfe zu leisten kostet natürlich keine Zeit...

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.

Der schöne Günther 8. Okt 2019 18:20

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.

haentschman 8. Okt 2019 19:00

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
TSEAMUserRoleRightDict war ein Tippfehler.
Korrekt wäre wie in den Codeschnippseln TUserRoleRightDict.

Danke...

haentschman 9. Okt 2019 05:48

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Moin...8-)
Zitat:

Eine Idee habe ich noch...aber erst morgen früh.
...Fazit: Eine Objektkopie mit Marshal/UnMarshal nimmt den Comparer nicht mit. :?

Danke für eure Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz