免费注册 查看新帖 |

Chinaunix

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

[请问]c++里面有set_new_handler,c里面怎么办? [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
1 [报告]
发表于 2009-01-07 10:32 |显示全部楼层
set_new_handler的作用是:
1、尝试“变”出更多内存,让系统可以继续运行下去(避免抛异常)
2、发现内存不足了,就提示用户/记录日志/保存数据,暂时延缓异常的抛出


所以,set_new_handler的返回值是上一次设置的new_handler(一般是系统默认的那个);这些new_handler每被调用一次,都应该恢复在它之前那个new_handler。


举例来说,我先保留2M内存,然后写了个my_new_handler;这个函数会释放这2M内存,然后恢复全局区保存的上一个new_handler。
这样,一旦第一次申请内存失败,my_new_handler就会“交”出2M内存,然后恢复上一个new_handler;如果这样仍然不能让new成功,那么系统就会再次调用当前new_handler,直到内存分配成功或者当前new_handler返回失败:

//伪码,实际可能有所差别
void * new(size_t size)
{
      do
      {
            void * p = malloc(size);
            if ( p == null )
            {
                 //内存分配失败,调用new_handle看能否搞到更多内存
           //如果new_handle返回false,直接抛异常;否则继续循环
                 if ( _call_new_handle() == false )
                      throw ...;
            }
            else
            {
                   return p;
            }
       } while(true);
}

系统默认的new_handler已经完成了抛异常这个任务(除非用编译器选项明确关上),所以没必要(也不应该)写自己的new_handler完成退出,因为这可能导致别人无法catch到new抛出的异常。
——————————————————————

在c里,可以参考上面的逻辑自己实现——不过throw要改成exit(ERR_MALLOC_FAILED)


——————————————————————
错误处理代码多于功能代码这个问题要看发生在什么地方。

多数情况下,不涉及网络、文件、资源申请以及其他可能不稳定的软硬件的调用,在传入参数正确时,是可以做到100%正确的。

比如,to_upper/sscanf/sqrt等等——除非你给sqrt传入了负值(不考虑虚数),它必定是可以返回正确结果的。

这类问题的根本原因是程序员糊涂了,必须让他改正,而不是用“容错”代码把这个大乌龙固定到源代码里。


同样,数据库里合理设置约束后,有用户名查不到资料这种情况必然是不会出现的——数据库本身的定义就决定了这点。
这时候,检查一个用户有多个资料、用户存在但select用户详细资料不成功等等错误就是没必要的,更不要为它写容错流程——assert一下就足够了。

一旦你为这些东西写了容错,那么你就不得不为这些容错的东西容错。这样项目自然复杂度失控,bug永远查不完。

[ 本帖最后由 shan_ghost 于 2009-1-7 10:37 编辑 ]

评分

参与人数 1可用积分 +2 收起 理由
jeanlove + 2 shan_ghost兄,我对你佩服的五体投地。 ...

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP