2

ある仮想クラスを別の仮想クラスに 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++
4

2 に答える 2

1

SIGSEGV は、次の場合にトリガーできますdynamic_cast

  • オブジェクトにはワイルド アドレスがあります
  • オブジェクトのメタデータ (通常は vtable ポインター) が破損しています
  • オブジェクトが式の静的型と一致しません

また

  • 式にポリモーフィック型がありません (つまり、 に渡される式の静的型であり、dynamic_castそれが指すオブジェクトの動的型だけではありません)。

ただし、最後のケースはコンパイラによってキャッチされるはずです。

于 2012-08-03T01:34:46.893 に答える
0

_BListnerは_AListnerから派生しているとおっしゃいました。_AListnerから派生した_CListnerのようなサードパーティのクラスはありますか?その場合、_CListnerオブジェクトを関数に渡すことは許可されますが、dynamic_castは失敗し、タイプstd::bad_castの例外をスローします。その例外をキャッチしないと、最終的にSIGSEGVが発生する可能性があります。

単なる仮定として、あなたは間違いなくより多くの情報を提供する必要があります。

于 2012-08-02T09:05:56.550 に答える