免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lsupper
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2010-11-13 16:25 |只看该作者
回复 20# unistd


    汗...关于socket...数据库连接呢?....或者其他一些需要安全的释放的资源呢?

论坛徽章:
0
22 [报告]
发表于 2010-11-13 17:37 |只看该作者
回复  unistd


    汗...关于socket...数据库连接呢?....或者其他一些需要安全的释放的资源呢?
lsupper 发表于 2010-11-13 16:25



难道你不知道程序退出时,linux内核会自动关闭该程序所有的文件描述符?socket链接在linux上的实现也是文件描述符!!!可以确定的告诉你,资源泄漏只发生在程序运行期间,如果程序推出了,他的任何资源包括泄漏的资源都会被内核清理干净。
别忘了,程序是运行在内核之上,所以一切都是受内核托管的。
你可能并不了解这个,以为程序崩溃了资源还不能释放呢,那操作系统也太不完善了。

论坛徽章:
0
23 [报告]
发表于 2010-11-13 22:10 |只看该作者
回复 22# unistd


    我是希望安全的关....那要你那样说...极端点...不如直接关机....重启....重启程序....

论坛徽章:
0
24 [报告]
发表于 2010-11-13 23:18 |只看该作者
回复  maxxfire


    捕获信号?能否详细点介绍?
lsupper 发表于 2010-11-12 21:58



比如你说的除0错,首先是不应该让它发生,加个分母判断嘛。。
如果程序实在有BUG导致非法退出(这种情况一般是内存地址错),可以捕获SIGSEGV,可以输出一些状态数据到日志什么的,也可以做一些拉圾资源清理操作,在系统死之前吭一声。。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
25 [报告]
发表于 2010-11-14 01:20 |只看该作者
本帖最后由 shihyu 于 2010-11-14 01:31 编辑
C++的一些习惯要改一下, 比如多出口;在C里面, 要健壮的处理错误, 函数还是单入口单出口容易写一些。



---------------------------------------------------------------------------------------------------------

c++ 怎樣代碼算是多個出口? 可以給我個代碼例子看看嗎?

謝謝

论坛徽章:
0
26 [报告]
发表于 2010-11-14 09:15 |只看该作者
回复 24# maxxfire


    嗯,好的,通过捕获信号?win32下也如此吗?

论坛徽章:
0
27 [报告]
发表于 2010-11-14 11:09 |只看该作者
程序写的足够健壮的话,理论上任何时候都不会core dump的,
其它的情况,一个判断语句就OK了。。。

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
28 [报告]
发表于 2010-11-14 12:42 |只看该作者
C++ 的RAII 机制只是让你感觉良好而已 ~  实际上如果在析构函数中出现了异常不仅会导致连接资源不释放,你的对象都有可能不会释放 ~

论坛徽章:
0
29 [报告]
发表于 2010-11-14 12:54 |只看该作者
本帖最后由 reiase 于 2010-11-14 12:56 编辑
回复  HonryZZ


    但是总有一些情况很复杂...你asset也出不来....我们希望在崩溃以后获取到一些东西 ...
lsupper 发表于 2010-11-12 19:06


assert不出来的,你也throw不出来,也就cache不到
所有你能写出一个逻辑,throw异常的,你都同样能写出一个逻辑来assert

所以C++异常只是assert的语法糖而已
真正的异常处理是java/C#那种运行时抛出异常,你能在语言层上捕获
C++这种操作系统抛出异常,你语言层捕获不到,异常做再好也白搭

根本上只能看看操作系统提供啥异常机制,比如Unix下的signal,Win32下的SEH(结构化异常处理)

论坛徽章:
0
30 [报告]
发表于 2010-11-15 04:26 |只看该作者
回复  unistd


    我是希望安全的关....那要你那样说...极端点...不如直接关机....重启....重启程序. ...
lsupper 发表于 2010-11-13 22:10



难以理解你的意思,返回值判断+errno足以!你以为C++的try-catch-finally就不是这么实现的?它只不过使用了lngjmp而已,效率还不如返回值判断+errno!难道脱离了catch和finally块,你就不知道怎么释放资源了?就不知道代码该写哪里了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP