什么可能导致 dynamic_cast 崩溃?
Posted
技术标签:
【中文标题】什么可能导致 dynamic_cast 崩溃?【英文标题】:What could cause a dynamic_cast to crash? 【发布时间】:2010-09-21 15:53:16 【问题描述】:我有一段代码看起来像这样:
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 吗?
【问题讨论】:
【参考方案1】:崩溃的一些可能原因:
obj
指向具有非多态类型的对象(没有虚方法的类或结构,或基本类型)。
obj
指向一个已被释放的对象。
obj
指向未映射的内存,或已映射的内存在访问时会产生异常(例如保护页或不可访问的页)。
obj
指向具有多态类型的对象,但该类型是在禁用 RTTI 的情况下编译的外部库中定义的。
并非所有这些问题都必然会在所有情况下导致崩溃。
【讨论】:
【参考方案2】:我建议对这段代码 sn-p 使用不同的语法。
if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj))
axis = monitorObject->GetXaxis();
如果其他线程正在删除 monitorObject 指向的内容或 obj 是疯狂的垃圾,您仍然可能崩溃,但至少您的问题不再与强制转换相关并且您没有执行两次 dynamic_cast。
【讨论】:
确实,'obj' 被另一个线程释放了,这导致了崩溃。感谢您的帮助!【参考方案3】:因为它只是偶尔崩溃,我敢打赌这是一个线程问题。检查所有对“obj”的引用:
grep -R 'obj.*=' .
【讨论】:
【参考方案4】:如果转换失败并且您正在转换为指针,那么dynamic_cast 将返回 0,这是您的情况。问题是您在代码的早期损坏了堆,或者未启用 rtti。
【讨论】:
【参考方案5】:你确定'obj'的值已经被正确定义了吗?
例如,如果它是未初始化的(即随机的),我可以看到它导致崩溃。
【讨论】:
确实,'obj' 被另一个线程释放了。感谢您的帮助【参考方案6】:obj的值可以被不同的线程改变吗?
【讨论】:
以上是关于什么可能导致 dynamic_cast 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章