SIGSEGV on dynamic_cast

SIGSEGV on dynamic_cast

本文关键字:cast dynamic on SIGSEGV      更新时间:2023-10-16

我正在尝试将一个虚拟类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++

SIGSEGV可以由dynamic_cast触发,当:

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

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

不过,编译器应该捕捉到最后一种情况。

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

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