18

私はこのようなコードを持っています:

TAxis *axis = 0;
if (dynamic_cast<MonitorObjectH1C*>(obj))
   axis = (dynamic_cast<MonitorObjectH1C*>(obj))->GetXaxis();

時々それはクラッシュします:

Thread 1 (Thread -1208658240 (LWP 11400)):
#0  0x0019e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1  0x048c67fb in __waitpid_nocancel () from /lib/tls/libc.so.6
#2  0x04870649 in do_system () from /lib/tls/libc.so.6
#3  0x048709c1 in system () from /lib/tls/libc.so.6
#4  0x001848bd in system () from /lib/tls/libpthread.so.0
#5  0x0117a5bb in TUnixSystem::Exec () from /opt/root/lib/libCore.so.5.21
#6  0x01180045 in TUnixSystem::StackTrace () from /opt/root/lib/libCore.so.5.21
#7  0x0117cc8a in TUnixSystem::DispatchSignals ()
   from /opt/root/lib/libCore.so.5.21
#8  0x0117cd18 in SigHandler () from /opt/root/lib/libCore.so.5.21
#9  0x0117bf5d in sighandler () from /opt/root/lib/libCore.so.5.21
#10 <signal handler called>
#11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

なぜクラッシュするのかわかりません。objはnullではありません(もしそうなら問題ではないでしょうか?)。

ダイナミックキャストがクラッシュする理由は何でしょうか?

キャストできない場合は、NULLを返す必要があります。

4

6 に答える 6

40

クラッシュのいくつかの考えられる理由:

  • obj非ポリモーフィック型(仮想メソッドのないクラスまたは構造体、または基本型)を持つオブジェクトを指します。
  • obj解放されたオブジェクトを指します。
  • objマップされていないメモリ、またはアクセス時に例外を生成するようにマップされたメモリ(ガードページやアクセスできないページなど)を指します。
  • objポリモーフィック型のオブジェクトを指しますが、その型はRTTIを無効にしてコンパイルされた外部ライブラリで定義されています。

これらの問題のすべてが必ずしもすべての状況でクラッシュを引き起こすわけではありません。

于 2008-11-11T04:45:21.050 に答える
11

このコード スニペットには別の構文を使用することをお勧めします。

if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
    axis = monitorObject->GetXaxis();
}

他のスレッドが monitorObject が指すものを削除している場合、または obj がクレイジーなガベージである場合でもクラッシュする可能性がありますが、少なくとも問題は関連するキャストではなく、dynamic_cast を 2 回実行していません。

于 2008-11-10T17:30:58.587 に答える
3

たまにしかクラッシュしないので、スレッドの問題だと思います。「obj」へのすべての参照を確認します。

grep -R 'obj.*=' .
于 2008-11-10T17:26:08.520 に答える
2

「obj」の値が正しく定義されていますか?

たとえば、初期化されていない(つまりランダムな)場合、クラッシュの原因となっていることがわかります。

于 2008-11-10T17:12:34.943 に答える
2

キャストが失敗し、ポインターにキャストしている場合、dynamic_cast は 0 を返します。問題は、コードの早い段階でヒープが破損しているか、rtti が有効になっていないことです。

于 2008-11-10T17:00:59.520 に答える
1

obj の値を別のスレッドで変更できますか?

于 2008-11-10T16:59:59.493 に答える