AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Access Violation in TObject.InheritsFrom von "is"-Operator
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation in TObject.InheritsFrom von "is"-Operator

Ein Thema von AuronTLG · begonnen am 5. Jul 2024 · letzter Beitrag vom 5. Jul 2024
 
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.687 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Access Violation in TObject.InheritsFrom von "is"-Operator

  Alt 5. Jul 2024, 09:13
Und nur um das das Offensichtliche auszuschließen: "XYZ" ist kein Nullpointer.

Dementsprechend habe ich zwei Merkwürdigkeiten:

1. Dass es bei der Nutzung vom is-Operator überhaupt knallen kann. Es ist ja nicht so dass man dabei irgendwas falsch machen könnte.
2. Dass es nur bei mir auftritt. Wobei ich es sicherheitshalber auch nochmal auf einem anderen PC mit komplett eigener Kompilierung ebenfalls reproduzieren konnte.
Dass es kein NIL-Pointer ist, heißt nicht, dass es ein Pointer auf ein gültiges Objekt ist.

Folgendes knallt auch:
Delphi-Quellcode:
var
  SomeObj: TSomeClass;
begin
  SomeObj := Pointer(5);
  if SomeObj = nil then
    raise Exception.Create('SomeObj ist nil');
  if not (SomeObj is TSomeClass) then
    raise Exception.Create('SomeObj ist kein TSomeClass');
end;
Da $00000005 kein Pointer auf ein TObject ist, knallt es hier auch schon beim Ausführen des IS-Operators.

So einfach wird es in Deinem Fall aber wohl nicht sein, sondern eher sowas wie:

Delphi-Quellcode:

procedure DoSomething(var _Obj: TSomeClass);
begin
  _Obj.Free;
end;

var
  SomeObj: TSomeClass;
begin
  SomeObj := TSomeClass.Create;
  DoSomething(SomeObj);
  if SomeObj = nil then
    raise Exception.Create('SomeObj ist nil');
  if not (SomeObj is TSomeClass) then
    raise Exception.Create('SomeObj ist kein TSomeClass');
end;
Der Pointer zeigt nach Aufruf von DoSomething auf eine inzwischen freigegebene Instanz von TSomeClass. Je nachdem, ob der davon benutzte Speicher in der Zwischenzeit anderweitig verwendet wurde oder nicht, wird der IS-Operator fehlschlagen oder nicht. Ob das der Fall ist, kann von vielen Bedingungen abhängen. Und es kann sein, dass es auf einem Rechner zu einem Fehler führt und auf einem anderen nicht.

Es gibt auch noch andere Möglichkeiten (z.B. irgendwas übeschreibt den Pinter), aber ich dieser Fall ist der wahrscheinlichste.
Thomas Mueller
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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