2008-11-10 305 views
18

我有一段代码看起来像这样:什么可能导致dynamic_cast崩溃?

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否?

回答

37

为崩溃的一些可能的原因:

  • obj指向与非多态类型(类或结构没有虚方法,或基本类型)的对象。
  • obj指向已释放的对象。
  • obj点映射的内存或存储器已在这样的方式访问时(例如,防护页面或不可访问的页),以产生一个异常被映射。
  • obj指向具有多态类型的对象,但该类型是在禁用了RTTI的外部库中定义的。

并非所有的这些问题,必然导致在所有情况下崩溃。

1

可以通过不同的线程更改obj的值吗?

+0

好直觉!另一个线程释放了'obj'。 – Barth 2008-11-11 07:39:54

2

如果转换失败并且您正在转换为指针(这是您的情况),dynamic_cast将返回0。问题在于你在代码的早期损坏了堆,或者rtti没有启用。

2

您确定'obj'的值已被正确定义吗?

如果例如它是未初始化的(即随机),我可以看到它导致崩溃。

+0

的确,'obj'被另一个线程释放了。感谢您的帮助 – Barth 2008-11-11 07:39:20

3

因为它有时只是崩溃,我敢打赌这是一个线程问题。检查所有对'obj'的引用:

grep -R 'obj.*=' .
11

我建议对此代码段使用不同的语法。

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

您仍然可以崩溃,如果其他线程被删除的内容monitorObject点,或者obj疯狂的垃圾,但至少你的问题是不是铸造了相关的,你没有做的dynamic_cast的两倍。

+1

确实,'obj'被另一个线程释放,导致崩溃。谢谢你的帮助 ! – Barth 2008-11-11 07:38:25