dynamic cast



  • Hallo,

    ich habe zwei Klassen. Klasse 1 ist die generelle Klasse "Obstacle". Klasse 2 wird von Klasse 1 abgeleitet und nennt sich "PlanarObstacle".

    Nun habe ich in meinem Programm einen Obstacle-Pointer auf ein Objekt. Zur Laufzeit will ich jetzt herausfinden ob es ein Objekt vom Typ "PlanarObstacle" ist. (Es gibt auch noch andere Typen)

    Mein Tutor hat gemeint, dass das folgendermaßen geht:

    PlanarObstacle* Planar3Ptr = dynamic_cast< PlanarObstacle* >( Obstac3Ptr );
    

    Anschließend kann man dann den Pointer Planar3Ptr überprüfen. Wenn er existiert, ist das Objekt vom Typ "PlanarObstacle", andernfalls nicht.

    Wenn ich das so mache, stürzt das Programm aber an der oben beschriebenen Codestelle ab (unbehandelte Ausnahme). Was mache ich falsch?

    Gruß, Amalthea



  • Hallo

    der Aufruf selber ist in Ordnung, bist du denn sicher, das Obstac3Ptr eine gültige Instanz egal welchen Types ist oder NULL?
    Mit anderen Worten : hast du einen sinnvollen Wert zugewiesen?

    bis bald
    akari



  • Ja, bin mir sicher... hab es gerade noch mal überprüft...

    Also nachdem mein oben geschriebener Code aufgerufen wurde, springt das Programm nach einigen Schritten an folgende Stelle (-->) und stürzt ab..

    _CRTIMP void * __cdecl malloc (
            size_t nSize
            )
    {
    -->      void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
    
            RTCCALLBACK(_RTC_Allocate_hook, (res, nSize, 0));
    
            return res;
    }
    

    Diese Codestelle befindet sich in "dbgheap.c"



  • Hallo

    da der Fehler anscheined nach dem Cast kommt :
    hast du denn mal das Ergebnis des Casts überprüft? Also so hier

    if (Planar3Ptr != NULL)
    {
      // Tue etwas mit Planar3Ptr
      }
    else
    {
      // Tue etwas, wenn Umwandlung nicht möglich
      }
    

    bis bald
    akari



  • Hallo,

    Ich kann das Ergebnis des Casts nicht überprüfen, da der Fehler kommt, bevor die nächste Zeile von "meinem" Code aufgerufen wird...

    Die Codestelle in meinem zweiten Post wird durch meine Codestelle aufgerufen. Ist aber nicht von mir programmmiert.... das steht in irendeiner bestehenden dll.
    Das ist der letzte Aufruf der stattfindet:
    msvcr71d.dll!malloc(unsigned int nSize=3765269347) Zeile 139 + 0x15 C
    bevor das programm abstürzt.



  • Mal geraten - übersetzt Du deine Anwendung mit RTTI? Ich meine, das muss man beim Visual Studio manuell aktivieren. (entnehme ich jetzt mal der Angabe, dass er in der msvcr71d.dll abstürzt)

    RTTI (RunTime Type Information) ist notwendig, damit dynamic_casts funktionieren können.



  • Hallo,

    hm, hab ich jetzt eingestellt. Das Programm stürzt aber trotzdem ab...

    Gruß, Amalthea



  • PlanarObstacle* Planar3Ptr = dynamic_cast< PlanarObstacle* >( Obstac3Ptr );
    

    Bist Du Dir denn auch sicher, dass Obstac3Ptr vorher auf etwas gültiges zeigt?
    Sonst poste mal ein wenig vom umliegenden Code.



  • Hallo,

    es funktioniert jetzt. Ich glaub es lag doch an den Projekteinstellungen, da ich sonst nichts geändert habe.

    Danke für den Tipp.

    Gruß, Amalthea


Anmelden zum Antworten