Hallo,
wenn man Fehler macht kann es ja vorkommen, dass auch ein Zugriff über eine Objektvariable die "Assigned" ist zu einer Zugriffsverletzung führt.
Da es "jemanden" gibt der diese
Exception wirft müsste es doch auch möglich sein darauf zu prüfen bevor die zugriffsverletzung passiert, oder?
Delphi-Quellcode:
If islegal(Myobject.free) then
Begin
end;
Oder?
Ganz so einfach ist die Sache nicht, die
Exception kommt irgendwo aus den Tiefen der virtuellen Speicherverwaltung des Betriebssystems, und es kommt nicht nur auf die Adresse selbst an, sondern auch darauf, was man damit anstellt (lesen, schreiben, ausführen), und wohin der Pointer zeigt (stack, Delphi memory manager heap,
OS memory). Es gibt zwar
OS-Funktionen wie IsBadReadPtr, IsBadWritePtr, IsBadCodePtr, VirtualQueryEx, aber die sind nur begrenzt nützlich. Selbst wenn MyObject eine legal aussehende Adresse enthält (z. B. aus einem Block des MMs) muß sie ja nicht auf eine Objekt der erwarteten Klasse zeigen, und selbst wenn sie das tut ist nicht gesagt, dass der Inhalt des Objektes noch in Ordnung ist. Im Allgemeinen ist dies eine Aufgabe aus der Klasse "Fool's errant", es ist pure Zeitverschwendung da schlicht nicht final lösbar. Halt lieber Disziplin, setz konsequent FreeAndNil für Objektvariablen ein, die außerhalb des lokalen Scopes sichtbar sind, oder verwende lifetime management über Interfaces anstelle von Objektreferenzen.