2

我正在尝试将一个虚拟类动态转换为另一个:

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

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

但我在调试时收到此错误:

SIGSEGV, Segmentaion fault.

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

2 回答 2

1

SIGSEGV 可以在以下情况下触发dynamic_cast

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

或者

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

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

于 2012-08-03T01:34:46.893 回答
0

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

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

于 2012-08-02T09:05:56.550 回答