免费注册 查看新帖 |

Chinaunix

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

最近在弄C++方面,突然想到C的话,出现异常情况,如何善后? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-12 18:57 |只看该作者 |倒序浏览
30可用积分
本帖最后由 lsupper 于 2010-11-17 16:56 编辑

最近我的工作基本转到了C++,在做项目的时候发现为了资源能够保证得到释放,会采用智能指针、try-catch等来处理异常发生时,还能够正常的把资源(socket、数据库连接、系统资源...)给释放了....
我想问的是:
     在纯C编程中,如果发生了一些错误(比如除0),导致数据读取错误,要崩溃了...如果保证把开始时候申请的内存给释放了?当然你要说进程结束了...自然会被系统管理...
但是我想知道有没有什么好的方法?能够保证在异常发生时,自动释放资源(可能要记录一些信息、日志....)。或者产生dump文件?
     这方面经验不足,请指教、拍砖...



收集答案如下:
1. 让应用程序崩溃的时候产生dump文件(这样方便寻错、调试):
    A、windows:
        a. 使用MiniDumpWriteDump API 来生成程序的Dump:
                 http://apps.hi.baidu.com/share/detail/17547925
        b. 使用 User Mode Process Dumper 为异常关闭或停止响应的进程保存转储文件:
                 http://blogs.itecn.net/blogs/ale ... Process-Dumper.aspx
    B、linux
        a. linux下是用kill -11命令
        b. Linux应用程序调试--debug coredump:
                 http://hi.baidu.com/hongszh/blog ... bef5d6f6039ee6.html
2. C++中的异常和错误(导致崩溃)是不一样的...
    A、异常可以捕获,捕获后,你可以手动的、安全的释放资源
    B、错误发生了,程序崩溃也是必要、正常的...既然出错,就不要继续跑下去了...(通过dump文件来查错...)
3. C++中的Try-catch...C可以通过setjmp/longjmp来模拟:
    http://blog.csdn.net/sanlongcai/archive/2007/09/01/1768726.aspx
    http://blog.codingnow.com/2010/05/setjmp.html (lbaby提供)
4. linux程序错误或者退出,可以通过捕获信号,简单例子见(54楼,谢谢:nketc)

总结如上,如有错误,请指出...

基本结论如上了...但是我不知道取谁的答案算完整的....汗....

评分

参与人数 1可用积分 +1 收起 理由
shang2010 + 1 我很赞同

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2010-11-12 19:04 |只看该作者
... 不释放吧..多加点assert,告诉编码者..这里挂了....修改之....

论坛徽章:
0
3 [报告]
发表于 2010-11-12 19:06 |只看该作者
回复 2# HonryZZ


    但是总有一些情况很复杂...你asset也出不来....我们希望在崩溃以后获取到一些东西...并且资源(socket、数据库连接等)能够得到尽量安全的释放....

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
4 [报告]
发表于 2010-11-12 19:18 |只看该作者
回复 1# lsupper

C里面采用判断的方式。满足条件才往下继续执行。
这是面向过程和面向对象的差异之一。

论坛徽章:
0
5 [报告]
发表于 2010-11-12 19:21 |只看该作者
回复 4# happy_fish100


    这个我不否认...但是,就像我在3楼回复的:

但是总有一些情况很复杂...你asset也出不来....我们希望在崩溃以后获取到一些东西...并且资源(socket、数据库连接等)能够得到尽量安全的释放....

   系统崩溃了还有dump文件...

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2010-11-12 19:22 |只看该作者
回复 5# lsupper

有这么复杂的情况么?
你用c,只要对函数调用返回值进行判断,就没有任何问题!

论坛徽章:
0
7 [报告]
发表于 2010-11-12 20:01 |只看该作者
系统异常我一般是捕获信号处理,采取必要的措施或输出必要的日志

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
8 [报告]
发表于 2010-11-12 20:37 |只看该作者
即便使用C++,也不能完全寄希望于try...catch,数组越界之流的段错误是try...catch捕捉不到的,至于除0么,既然都有除0的毛病,为什么不可以在一开始就避免?
用C一般要保证程序只有一个出口,这样扫尾工作只用做一次就够了。现在虽然都用C++,不过一般来说我还是会遵守这个规则。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
9 [报告]
发表于 2010-11-12 21:50 |只看该作者
捕获信号,在信号处理函数中做资源释放之类的。

论坛徽章:
0
10 [报告]
发表于 2010-11-12 21:56 |只看该作者
回复 6# happy_fish100


    用对那肯定...主要是当发生一些不可预料的错误的时候...有什么办法没?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP