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 no 吗?

4

6 回答 6

40

崩溃的一些可能原因:

  • obj指向具有非多态类型的对象(没有虚方法的类或结构,或基本类型)。
  • obj指向一个已被释放的对象。
  • obj指向未映射的内存,或已以在访问时生成异常的方式映射的内存(例如保护页或不可访问页)。
  • obj points to an object with a polymorphic type, but that type was defined in an external library that was compiled with RTTI disabled.

Not all of these problems necessarily cause a crash in all situations.

于 2008-11-11T04:45:21.050 回答
11

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

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

如果其他线程正在删除 monitorObject 指向的内容或者 obj 是疯狂的垃圾,您仍然可能崩溃,但至少您的问题不再与强制转换相关并且您没有执行两次 dynamic_cast。

于 2008-11-10T17:30:58.587 回答
3

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

grep -R 'obj.*=' 。
于 2008-11-10T17:26:08.520 回答
2

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

于 2008-11-10T17:00:59.520 回答
2

您确定“obj”的值已正确定义吗?

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

于 2008-11-10T17:12:34.943 回答
1

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

于 2008-11-10T16:59:59.493 回答