关于dynamic_cast的SIGSEGV

时间:2012-08-02 08:14:45

标签: c++ dynamic-cast

我正在尝试将dynamic_cast,一个虚拟类转移到另一个虚拟类:

SomeClass::SomeFunc(_AListner& listner)
_BListner* listner = dynamic_cast<_BListner*>(&listner) 

请注意,类_BListner派生自类_AListner。

但是我在调​​试时遇到了这个错误:

SIGSEGV, Segmentaion fault.

<some address> in  __dynamic_cast () from /usr/lib/libstdc++

2 个答案:

答案 0 :(得分:1)

可以在dynamic_cast时触发SIGSEGV:

  • 该对象具有通配地址
  • 对象的元数据(通常是vtable指针)已损坏
  • 该对象与表达式的静态类型
  • 不匹配

  • 表达式没有多态类型(表示传递给dynamic_cast的表达式的静态类型,而不仅仅是它指向的对象的动态类型)。

最后一种情况应该由编译器捕获。

答案 1 :(得分:0)

你提到_BListner是从_AListner派生的。你有_CListner这样的第三方类,它也来自_AListner吗?如果是这样,则允许将_CListner对象传递给您的函数,但dynamic_cast会失败并抛出类型为std :: bad_cast的异常。最终不会捕获该异常可能导致SIGSEGV。

只是一个假设,你肯定需要提供更多信息。