6

假设我有一个类 A 和一个派生自 A 的类 B。现在,我想使用 dynamic_cast 将 const A*(称为“a”)转换为 B*(见下文)。如果“a”真的是 B*,那么我得到的对象指针应该没问题。如果“a”不是 B*,那么我将得到 NULL。

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

由于某种原因,dynamic_cast 操作会导致 SEGFAULT。如果“a”不为空,怎么会发生这种情况?我猜如果有任何转换问题,dynamic_cast 会给我一个 NULL 指针,而不是 SEGFAULT。如果我试图访问“b”并且动态转换不成功,我应该只获得 SEGFAULT,对吗?我什至还没有尝试访问“b”。

那么,这怎么会发生呢?在上面的代码中是否有任何东西可以导致 dynamic_cast 到 SEGFAULT,我不知道?

提前致谢 :-)

编辑:通过 GDB 运行我的实际程序会给出以下输出:

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

输出中的下一行只是指向我的代码中进行动态转换的行。

4

3 回答 3

17

使用 dynamic_cast 时可能导致崩溃的原因

  • 指针指向一个空闲的内存块。
  • 指针指向非多态类型。
  • 指针指向具有多态类型但存在于禁用 RTTI 编译的外部库中的对象。
  • 指针指向可能导致保护异常的内存访问(例如保护页或不可访问页)。

验证其中一种情况是否适用于您。

于 2013-01-09T18:30:25.757 回答
2

对于像我这样的其他人,您可能不小心给了转换对象与您从中转换它的对象相同的变量名!

A *name = new B();
B *name = dynamic_cast<B*>(name);

对于如此明显的代码,这显然是错误的,但是由于变量分散并且演员表被混淆,这样的错误可能更难被发现!

于 2016-04-21T15:34:46.783 回答
0

我得到了这个...这是因为我未能初始化指针,它指向随机垃圾。

于 2016-10-20T07:57:12.210 回答