C++:即使被转换的对象不是NULL,dynamic_cast也会导致SEGFAULT.怎么会发生这种情况?

pvh*_*987 6 c++ dynamic-cast segmentation-fault

假设我有一个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);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,dynamic_cast操作会导致SEGFAULT.如果"a"不是NULL,怎么会发生?我想如果有任何转换问题,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
Run Code Online (Sandbox Code Playgroud)

输出中的下一行只是指向我的代码中的行,我在那里进行动态转换.

Abh*_*jit 14

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

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

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

  • 另一种可能性是在共享库中声明的类型和编译器是 g++。例如,请参阅:http://stackoverflow.com/questions/2351786/dynamic-cast-fails-when-used-with-dlopen-dlsym (2认同)