C++: dynamic_cast Ursachen ein SEGFAULT, auch wenn das Objekt, das vergossen wird, nicht NULL ist. Wie kann das passieren?

Angenommen ich habe eine Klasse A und eine Klasse B, abgeleitet von A. Nun möchte ich cast einen const-A* (genannt "a") a B* mit dynamic_cast (siehe unten). Wenn "ein" war wirklich eine B*, dann ist mein Gegenstand, der Zeiger sollte in Ordnung sein. Wenn "a" nicht a B*, dann bekomme ich NULL.

const A* a = new B();
const B* b = dynamic_cast<const B*>(a);

Aus irgendeinem Grund, den dynamic_cast-operation führt zu einem segmentation Fault. Wie kann das passieren, wenn "ein" ist NICHT NULL? Ich denke, dass dynamic_cast wird mir eine NULL-Zeiger, wenn es keine Konvertierung Probleme, anstatt einen SEGFAULT. Sollte ich nur ein segmentation Fault, wenn ich versuche, Zugriff auf "b" und die dynamic cast nicht erfolgreich war, richtig? Ich habe nicht einmal versucht, Zugriff auf "b" noch nicht.

So, wie kann das passieren? Gibt es etwas, dass kann dazu führen, dynamic_cast, um SEGFAULT in dem obigen code, die mir nicht bekannt sind?

Vielen Dank im Voraus 🙂

EDIT: mit meinem eigentlichen Programm durch GDB gibt diese Ausgabe:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) where
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff6c0e612 in __cxxabiv1::__dynamic_cast (src_ptr=<optimized out>, 
src_type=0x4fa6b0, dst_type=0x516bb0, src2dst=0)
at /var/tmp/portage/sys-devel/gcc-4.6.3/work/gcc-4.6.3/libstdc++-v3/libsupc++/dyncast.cc:61

Die nächste Zeile in der Ausgabe nur auf die Zeile in meinem code, wo ich die dynamic-casting.

  • Sind Sie polymorph?
  • Das problem ist die definition von A und B – mit entsprechenden Definitionen, dein code funktioniert. Daher post einen minimalen, vollständigen code!
  • Da dein Beispiel-code ist offensichtlich nicht Ihr richtiger code, verwenden Sie dynamic_cast um einen Verweis-Typ anstelle von einem Zeiger-Typ? In diesem Fall wird eine Ausnahme geworfen. Siehe hier: ideone.com/uugF37
  • Nicht "angenommen" code zu uns, schreiben die minimale, kompilierbare test-code und zeigen Sie uns. Sonst bist du von uns verlangt, die Verwendung psychischer Kräfte, um fix-code.
InformationsquelleAutor pvh1987 | 2013-01-09
Schreibe einen Kommentar