dynamic_castがクラッシュする原因は何ですか?
-
07-07-2019 - |
質問
次のようなコードがあります:
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を返す必要がありますか?
解決
クラッシュの考えられるいくつかの理由:
-
obj
は、非多相型(仮想メソッドを持たないクラスまたは構造体、または基本型)のオブジェクトを指します。 -
obj
は、解放されたオブジェクトを指します。 -
obj
は、マップされていないメモリ、またはアクセス時に例外を生成するようにマップされたメモリ(ガードページやアクセスできないページなど)を指します。 -
obj
は多相型を持つオブジェクトを指しますが、その型はRTTIを無効にしてコンパイルされた外部ライブラリで定義されています。
これらの問題のすべてが必ずしもすべての状況でクラッシュを引き起こすわけではありません。
他のヒント
このコードスニペットに別の構文を使用することをお勧めします。
if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
axis = monitorObject->GetXaxis();
}
他のスレッドがmonitorObjectが指すものを削除している場合、またはobjがガベージガベージである場合、クラッシュする可能性がありますが、少なくとも問題は関連するキャストではなく、dynamic_castを2回実行していません。
時々クラッシュするので、スレッドの問題だと思います。 「obj」へのすべての参照を確認します。
grep -R 'obj.*=' .
dynamic_castは、キャストが失敗し、ポインターにキャストしている場合に0を返します。これはあなたの場合です。問題は、コードの早い段階でヒープが破損しているか、rttiが有効になっていないことです。
「obj」の値が正しく定義されていることを確認しますか?
たとえば、初期化されていない(つまりランダムな)場合、クラッシュの原因になることがわかりました。
objの値は別のスレッドによって変更できますか?
所属していません StackOverflow