免费注册 查看新帖 |

Chinaunix

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

[C++] 用返回值返回错误真是一个错误啊! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-11-24 18:32 |只看该作者
原帖由 lipingtababa 于 2008-11-24 18:30 发表


又来了,上次谈引用的帖子您也是一句话"引用真是太好用了",然后什么也不多说.

这里,我又是拷贝代码又是举例,就是想说用返回值返回错误不方便使用,如果我说得片面了,欢迎指教.

可你老人家一句话就下结论 ...

个人习惯,有什么好举例好解释的?你举例能说服我?我举例能说服你?

ps,啥话都别说那么绝。

论坛徽章:
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
12 [报告]
发表于 2008-11-24 18:55 |只看该作者
要是new都失败的话,那还有救吗?这种情况应该更新硬件。。。
不大喜欢使用异常,异常是个重量级的结构,通常不用。
API里面应该也没有以返回异常作为错误的(也可能是个人经验不足没遇到)。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2008-11-24 19:16 |只看该作者
垃圾代码加心理强迫症

论坛徽章:
0
14 [报告]
发表于 2008-11-24 22:02 |只看该作者
这种情况很常见,没想到好的处理方法。
异常的话太麻烦了。如果某个函数throw异常,那么所有直接或者间接调用它的代码要很小心的去处理。每个调用点都要考虑资源的的释放。
而且本身抛异常还那么多讲究,看看me上一大坨都懒得去看。

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
15 [报告]
发表于 2008-11-25 01:10 |只看该作者
原帖由 w_anthony 于 2008-11-24 18:55 发表
要是new都失败的话,那还有救吗?这种情况应该更新硬件。。。
不大喜欢使用异常,异常是个重量级的结构,通常不用。
API里面应该也没有以返回异常作为错误的(也可能是个人经验不足没遇到)。



new失败我不清楚,


不过malloc失败,并不一定要“更新硬件”,还可能是内存写越界啥的。

论坛徽章:
0
16 [报告]
发表于 2008-11-25 01:18 |只看该作者
原帖由 flw 于 2008-11-24 19:16 发表
垃圾代码加心理强迫症



你还是去跟人讨论Perl好还是Python好,或者Linux如何比Windows好吧,山寨版Bjarne Stroustrup先生。

论坛徽章:
0
17 [报告]
发表于 2008-11-25 07:14 |只看该作者
这种情况用异常,个人感觉每必要

论坛徽章:
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
18 [报告]
发表于 2008-11-25 10:45 |只看该作者
何不试试new_handle?

new_handle的工作原理是: 当new内部发现内存不足时,它会首先检查是否用户安装有new_handle(用set_new_handle);如果有,它就先调用set_new_handle指定的函数,然后再次尝试分配内存。

所以,new_handle内部应该: 1、想办法搞出更多内存;或者2、记录此异常,然后返回失败,让new抛异常。


通常做法是:
1、程序一启动,就分配一大块内存备用,然后设置new_handle
2、new失败,系统自动调用new_handle,于是我们可以释放之前保留的那一大块内存
3、还原系统new_handle
4、提示用户内存不足;有必要的话要保存当前运行现场,然后重启系统并恢复运行。

——————————————————————
如果代码写的不太垃圾,那么一个大中规模的项目都应该有自己的内存管理方案——一般是内存池。

如果项目较小或者不愿意自己写内存池,那么可以尝试下stl——很多stl的实现都有很不错的小对象池。


“裸”用new/delete分配几个字节本身就是个极坏的习惯,一个代码中随处new/delete的项目是可怕的。
事实上,即使不用内存池,99%的情况下也都可以通过稍微更改接口而把它们置于栈上。

论坛徽章:
0
19 [报告]
发表于 2008-11-25 10:59 |只看该作者
写个宏不就完了,比如简单点的:
#define CHECK(expr) do { if (!(expr)) { fprintf(stderr, "CHECK failure for %s\n", #expr); exit(1); } while (0)

CHECK(AddUShort(10));
CHECK(AddUString("root"));
CHECK(AddULong(1000L));
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP