免费注册 查看新帖 |

Chinaunix

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

[C] 内存分配失败时,是否应该调用exit()来简化代码啊,纠结 [复制链接]

论坛徽章:
2
15-16赛季CBA联赛之天津
日期:2016-12-20 17:56:18CU十四周年纪念徽章
日期:2017-04-20 16:30:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-04-19 11:17 |只看该作者 |倒序浏览
比如入队:
1、void enqueue(struct queue *, void *data);
2、int enqueue(struct queue *, void *data);
我一般用第2种方法,但感觉写业务代码时,每次都要判断,好繁琐啊

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2017-04-19 11:43 |只看该作者
一般不会失败的。而是在你使用这块内存的时候给你来个oom。所以根本就不要判断。
要避免oom应该先占一块内存,写一遍数据,然后用这块内存按适合的算法进行分块分配回收等。

论坛徽章:
2
15-16赛季CBA联赛之天津
日期:2016-12-20 17:56:18CU十四周年纪念徽章
日期:2017-04-20 16:30:16
3 [报告]
发表于 2017-04-19 14:07 |只看该作者
回复 2# xinglp

我找了找别人写的代码,的确有不对malloc()返回作判断的;更多的做法是把
struct queue_node {
        struct queue_node *next;
        struct quque_node *prev;
        void *data;
};
这样的节点暴露出来,让用户自己分配空间,问题是解决了,但总感觉用起来不够方便

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2017-04-19 14:26 |只看该作者
lhd666 发表于 2017-04-19 14:07
回复 2# xinglp

我找了找别人写的代码,的确有不对malloc()返回作判断的;更多的做法是把

用户和你的接口在同一个程序里面,你觉得enqueue失败了,用户代码就能malloc成功了?

malloc分配的是虚拟空间地址,64位不存在失败的可能,具体可以看我之前问的这个帖子:《malloc到底会不会返回NULL?

论坛徽章:
2
15-16赛季CBA联赛之天津
日期:2016-12-20 17:56:18CU十四周年纪念徽章
日期:2017-04-20 16:30:16
5 [报告]
发表于 2017-04-19 14:37 |只看该作者
回复 4# lxyscls

谢谢!
我说暴露节点,问题解决,是指把包袱丢给调用者了

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2017-04-19 14:56 |只看该作者
lhd666 发表于 2017-04-19 14:37
回复 4# lxyscls

谢谢!

你把内部实现暴露了,你哪天想改一下queue的内部实现就难了

论坛徽章:
2
15-16赛季CBA联赛之天津
日期:2016-12-20 17:56:18CU十四周年纪念徽章
日期:2017-04-20 16:30:16
7 [报告]
发表于 2017-04-19 15:04 |只看该作者
本帖最后由 lhd666 于 2017-04-19 15:15 编辑

回复 6# lxyscls

嗯,而且调用者还可能改动prev和next指针。
我对解耦这方面一直做得不好,常规的数据结构,因为学过,倒是好一点,其它方面总是做得有问题

论坛徽章:
3
处女座
日期:2015-03-18 14:35:45羊年新春福章
日期:2015-03-18 14:48:23午马
日期:2015-03-18 14:51:09
8 [报告]
发表于 2017-04-20 10:01 |只看该作者
kernel 里面的list.h还不好用吗?

论坛徽章:
2
15-16赛季CBA联赛之天津
日期:2016-12-20 17:56:18CU十四周年纪念徽章
日期:2017-04-20 16:30:16
9 [报告]
发表于 2017-04-20 16:30 |只看该作者
回复 8# mr_sev

当然非常好用啊,是我目前见过的最好用的链表,但内核代码是GPL协议发布的,不能随便用啊,我一向是支持GPL的。

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
10 [报告]
发表于 2017-04-22 10:12 |只看该作者
lhd666 发表于 2017-04-20 16:30
回复 8# mr_sev

当然非常好用啊,是我目前见过的最好用的链表,但内核代码是GPL协议发布的,不能随便用 ...


去看看 BSD  的 queue.h,随便用。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP