【发布时间】:2013-01-09 18:20:58
【问题描述】:
假设我有一个类 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
输出中的下一行只是指向我的代码中我进行动态转换的行。
【问题讨论】:
-
问题出在
A和B的定义中——只要有适当的定义,你的代码就可以工作。因此,发布一个最小的、完整的代码! -
由于您的示例代码显然不是您的真实代码,您是否使用
dynamic_cast来获取引用类型而不是指针类型?在这种情况下,将引发异常。见这里:ideone.com/uugF37 -
不要向我们“假设”代码,编写最小的、可编译的测试代码并展示我们。否则,您是在要求我们使用精神力量来修复您的代码。
标签: c++ segmentation-fault dynamic-cast