lhd666 发表于 2017-04-19 11:17

内存分配失败时,是否应该调用exit()来简化代码啊,纠结

比如入队:
1、void enqueue(struct queue *, void *data);
2、int enqueue(struct queue *, void *data);
我一般用第2种方法,但感觉写业务代码时,每次都要判断,好繁琐啊{:qq10:}

xinglp 发表于 2017-04-19 11:43

一般不会失败的。而是在你使用这块内存的时候给你来个oom。所以根本就不要判断。
要避免oom应该先占一块内存,写一遍数据,然后用这块内存按适合的算法进行分块分配回收等。

lhd666 发表于 2017-04-19 14:07

回复 2# xinglp

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

lxyscls 发表于 2017-04-19 14:26

lhd666 发表于 2017-04-19 14:07
回复 2# xinglp

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


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

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

lhd666 发表于 2017-04-19 14:37

回复 4# lxyscls

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

lxyscls 发表于 2017-04-19 14:56

lhd666 发表于 2017-04-19 14:37
回复 4# lxyscls

谢谢!


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

lhd666 发表于 2017-04-19 15:04

本帖最后由 lhd666 于 2017-04-19 15:15 编辑

回复 6# lxyscls

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

mr_sev 发表于 2017-04-20 10:01

kernel 里面的list.h还不好用吗?

lhd666 发表于 2017-04-20 16:30

回复 8# mr_sev

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

wait_rabbit 发表于 2017-04-22 10:12

lhd666 发表于 2017-04-20 16:30
回复 8# mr_sev

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


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

页: [1] 2
查看完整版本: 内存分配失败时,是否应该调用exit()来简化代码啊,纠结