免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7473 | 回复: 7
打印 上一主题 下一主题

[C++] 这个dynamic_cast不能抛出异常,而是崩溃了!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-01 14:27 |只看该作者 |倒序浏览
10可用积分
如题,我写了下面这个程序,测试dynamic_cast错误处理的情况
#include <stdio.h>
#include <stdlib.h>
#include <typeinfo>
using namespace std;
class A{
public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void fa(){}
};
class B{
public:
&nbsp;&nbsp;&nbsp;&nbsp;int y;
&nbsp;&nbsp;&nbsp;&nbsp;//virtual void foo(){}

};
class D:public B{
public:
&nbsp;&nbsp;&nbsp;&nbsp;int z;
};
int main(int argc, char *argv[]){
&nbsp;&nbsp;&nbsp;&nbsp;B* pb=new B();
&nbsp;&nbsp;&nbsp;&nbsp;B& rb=*pb;
&nbsp;&nbsp;&nbsp;&nbsp;try{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D& rd =dynamic_cast<D&>(rb);//本语句会抛出std::bad_cast

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A* pa=(A*)pb;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D* pd=dynamic_cast<D*>(pa);
&nbsp;&nbsp;&nbsp;&nbsp;}catch(std::bad_cast){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("std::bad_cast\n");
&nbsp;&nbsp;&nbsp;&nbsp;}catch(...){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("get other exception\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//system("PAUSE");

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


我期望pa被dynamic_cast转型的时候,能抛出某种异常,但是实际上程序崩溃了。
=====================================================
我的环境是winxp+devcpp4992,是gcc/gdb的集成环

>gcc --version
gcc (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

请dx帮忙解释一下,10分感谢!

[ 本帖最后由 jeanlove 于 2009-2-1 14:28 编辑 ]

最佳答案

查看完整内容

我觉得崩溃时因为你前面的那个c-style cast使得RTTI寻找对象的类层次时候访问内存越界导致的。

论坛徽章:
0
2 [报告]
发表于 2009-02-01 14:27 |只看该作者
原帖由 jeanlove 于 2009-1-31 22:43 发表

谢谢,但是有点不明白的地方,就是我之前
D& rd =dynamic_cast(rb);
这句话是可以成功抛出异常的,这是不是说明异常处理的功能已经启用了呢????


我觉得崩溃时因为你前面的那个c-style cast使得RTTI寻找对象的类层次时候访问内存越界导致的。

论坛徽章:
0
3 [报告]
发表于 2009-02-01 14:32 |只看该作者
GCC编译选项

/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH

from: http://www.cppblog.com/mydriverc/articles/33144.html


从我的经验来说,我建议尽量不要在C++里面使用异常。

[ 本帖最后由 wwwsq 于 2009-2-1 14:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-01 14:43 |只看该作者
原帖由 wwwsq 于 2009-2-1 14:32 发表
GCC编译选项

/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ E ...

谢谢,但是有点不明白的地方,就是我之前
D& rd =dynamic_cast<D&>(rb);
这句话是可以成功抛出异常的,这是不是说明异常处理的功能已经启用了呢????

论坛徽章:
0
5 [报告]
发表于 2009-02-01 14:51 |只看该作者
2楼的方法可行不???我也遇到这种问题了,只不过我的数据环境比较复杂,不会每次都暴掉,大概一两个月崩一次。因为我是引用静态库里面的函数,也用了try,跟踪到调用的函数后就没法跟踪了
  try{   
      ...//中间调用静态库函数,崩溃了
   }catch(...){   
        ....//出错了   
  }

[ 本帖最后由 bezd 于 2009-2-1 15:10 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-02-01 15:33 |只看该作者
原帖由 emacsnw 于 2009-2-1 15:20 发表


我觉得崩溃时因为你前面的那个c-style cast使得RTTI寻找对象的类层次时候访问内存越界导致的。

我把B加上了那个virtual的关键字,似乎就不会崩溃了。感觉这个解释最贴切,还是要给分的!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2009-02-01 15:45 |只看该作者
因为
1. rb的静态类型是class  B
2. class B不包含任何virtual函数
所以我觉得
D& rd =dynamic_cast<D&>(rb);
在逻辑上,本身就讲不通。
class B不是一个动态类型时,即没有人会写出 B* p = new D 这样的语句,自然也就不存在 dynamic_cast<D&>(rb);

论坛徽章:
0
8 [报告]
发表于 2009-02-01 15:59 |只看该作者
如果针对指针类型的dynamic_cast失败,则结果是0, 如果针对引用类型的dynamic_cast失败,则抛出一个异常.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP