当前位置:  开发笔记 > 编程语言 > 正文

什么可能导致dynamic_cast崩溃?

如何解决《什么可能导致dynamic_cast崩溃?》经验,为你挑选了2个好方法。

我有一段看起来像这样的代码:

TAxis *axis = 0;
if (dynamic_cast(obj))
   axis = (dynamic_cast(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 
#11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

我不知道为什么它会崩溃.obj不是null(如果它不是问题,不是吗?).

动态演员崩溃的原因是什么?

如果它不能转换,它应该只返回NULL不?



1> bk1e..:

崩溃的一些可能原因:

obj 指向具有非多态类型的对象(没有虚方法或基本类型的类或结构).

obj 指向已释放的对象.

obj 指向未映射的内存,或已经映射的内存,以便在访问时生成异常(例如保护页面或无法访问的页面).

obj 指向具有多态类型的对象,但该类型是在已禁用RTTI的情况下编译的外部库中定义的.

并非所有这些问题都会导致所有情况下的崩溃.



2> bradtgmurray..:

我建议为此代码段使用不同的语法.

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

如果某个其他线程正在删除monitorObject指向的内容,或者如果obj是疯狂的垃圾,你仍然可以崩溃,但至少你的问题不再是相关的,你没有做两次dynamic_cast.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有