Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Zugriffsverletzung bei Zugriff auf Objekt

  Alt 5. Jul 2007, 11:01
Zwei allgemeine Hinweise bzw. Hilfen:

- Klassenmember werden mit Nil, 0, false, 0.0, etc initialisiert. Eine Zuweisung von Nil im Constructor ist nicht nötig.
- Eine Abfrage mit IS beachtet ein Nil Objekt und gibt dann false zurück. Man kann sich also folgendes verkürzen:
Delphi-Quellcode:
If assigned(Object) and ( Object is TMyClass ) then
  TMyClass(Object).Blubb;
zu einem einfachen  if Object is TMyClass then Und nun noch was grundsätzliches: Folgendes steht doch fest:

1. es wird mit NIL initialisiert. Es ist auch ordentlich nil.
2. während der Laufzeit wird irgendwann mal ein Objekt zugewiesen (es ist nicht mehr nil)
3. Es wird während der Laufzeit darauf zugegriffen und es ist nicht nil, aber der Zugriff schlägt fehl.

Somit würde es bedeuten, das das Element freigegeben wurde aber die Referenz in Instance nicht aktualisiert (sprich: nil gesetzt) wurde.

Lösung des Problems: Finden wo es gesetzt wird und dies objekt weiter verfolgen bzw. wo diese freigegeben wurde. Dabei würde ich entweder einen Brechpunkt auf Instance setzen und "bei Änderungen anhalten" wählen oder du definierst Instance als Property um und stellst einen Brechpunkt in den Setter. Wenn dieser auslöst, dann das zugewiesene Objekt ermitteln. Dann in den Destructor stellen und bei dem Brechpunkt die Bedingung einfügen, welche den Namen des Komponente oder den Klassennamen vergleicht (zur Not auch die Instanz selber). Wenn dieser dann auslöst, dann weiss man wo diese freigegeben wird (Aufruf Stack, STRG-ALT-S) und man kann sich nun fragen, warum dort vorher nicht das Instance Feld auf NIL gesetzt wurde.

Und noch was zu meinem vorherigen Beitrag, auch wenn es eine pampige Antwort nach sich zog: hinter der "lockeren" Beschreibung mit Instance hatte ich eine Eigenschaft von TObject vermutet (ähnliche InstanceSize) und nicht eine eigene! Auch wenn es somit am Thema vorbei ging, aber es war nur gut geraten, schliesslich gab es keinen Quellcode und keine eindeutige Beschreibung die dies ausschliessen liess. Also 'tschuldigung, dass meine Glaskugel was falsches orakelt hatte...
  Mit Zitat antworten Zitat