我有一段看起来像这样的代码:
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 no?
答案 0 :(得分:37)
崩溃的一些可能原因:
obj
指向具有非多态类型的对象(没有虚方法或基本类型的类或结构)。obj
指向已释放的对象。obj
指向未映射的内存,或者已经映射的内存,以便在访问时生成异常(例如保护页面或无法访问的页面)。obj
指向具有多态类型的对象,但该类型是在已禁用RTTI的情况下编译的外部库中定义的。并非所有这些问题都会导致所有情况下的崩溃。
答案 1 :(得分:11)
我建议为此代码段使用不同的语法。
if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
{
axis = monitorObject->GetXaxis();
}
如果某个其他线程正在删除monitorObject指向的内容或obj是疯狂的垃圾,你仍然可以崩溃,但至少你的问题不再是相关的,你没有做两次dynamic_cast。
答案 2 :(得分:3)
因为它有时只会崩溃,我敢打赌这是一个线程问题。检查对'obj'的所有引用:
grep -R 'obj.*=' .
答案 3 :(得分:2)
dynamic_cast将返回0,这是您的情况。问题是您在代码中早先损坏了堆,或者没有启用rtti。
答案 4 :(得分:2)
您确定'obj'的值已正确定义吗?
例如,如果它未被初始化(即随机),我可以看到它导致崩溃。
答案 5 :(得分:1)
可以通过不同的线程更改obj的值吗?