TObjectList.Clear Zugriffsverletzung

7

Ich stoße auf ein sehr seltsames Problem mit einer großen Anwendung. Ich verwende TObjectList, das ein benutzerdefiniertes Objekt auf ihnen speichert. Auf großen Listen im erfahre seltsame Abstürze mit "Zugriffsverletzung bei Adresse .. Leseadresse .." "Privilegierte Anweisung" und andere, wenn ich die CLEAR-Methode verwende. Ich habe festgestellt, dass genau dies geschieht, wenn versucht wird, das letzte Element in der Liste zu löschen. Ich habe dies überprüft, indem ich die Löschung der enthaltenen Objekte von ihrem destroy proc protokolliere und auch versuche, sie selbst zu löschen (für ein: = olist.count-1 downto 0 do .. debugmsg ('lösch' + inttostr (a) ) .. olist.delete (a)), beide Möglichkeiten bekomme ich die Zugriffsverletzung rechts beim Löschen der letzte verbleibende Element in der Liste.

Das passiert nicht immer, weil ich klar in anderen Bereichen verwende, und auch ein paar verschiedene (kleinere) Listen, aber an einem ganz bestimmten Punkt in meiner App passiert das.

Ich habe keine Ahnung, was falsch sein könnte, es gibt nichts, was versucht, während des Löschens auf die Liste zuzugreifen, und die eingefügten Objekte haben keinen Zugriff auf ihre Eltern-Objektliste, da muss etwas in der TObjectList.delete / Methoden löschen, wenn es um das Löschen des letzten Elements geht.

Irgendwelche Vorschläge? Verwenden von Delphi XE.

    
hikari 18.02.2011, 16:13
quelle

2 Antworten

18

Das klingt für mich so, als würden Sie bereits befreite Objekte befreien. Um dies nachzuverfolgen, laden Sie die Vollversion herunter FastMM , fügen Sie FullDebugMode zur Zeile Conditional Defines unter Project Options - & gt; Delphi Compiler hinzu und die Option Map File unter Linking auf Detailed, und rebuild. (Erstellen, nicht kompilieren.) Kopieren Sie dann die FullDebugMode-DLL in denselben Ordner wie Ihre EXE und führen Sie sie aus. Es wird Ihr Gedächtnis beobachten, während Sie es zuweisen und freigeben, und wenn Sie versuchen, das gleiche Objekt ein zweites Mal freizugeben, wird es das auffangen und Ihnen sehr detaillierte Debug-Daten geben, wo das Problem herkommt.

>     
Mason Wheeler 18.02.2011, 16:27
quelle
1

Sind Sie sicher, dass das letzte Objekt gültig und nicht bereits gelöscht ist? Es könnte zweimal in der Liste sein, z.B. aufgrund anderer Fehler.

    
Erik 18.02.2011 16:20
quelle

Tags und Links