内存分配失败时,是否应该调用exit()来简化代码啊,纠结
比如入队:1、void enqueue(struct queue *, void *data);
2、int enqueue(struct queue *, void *data);
我一般用第2种方法,但感觉写业务代码时,每次都要判断,好繁琐啊{:qq10:}
一般不会失败的。而是在你使用这块内存的时候给你来个oom。所以根本就不要判断。
要避免oom应该先占一块内存,写一遍数据,然后用这块内存按适合的算法进行分块分配回收等。 回复 2# xinglp
我找了找别人写的代码,的确有不对malloc()返回作判断的;更多的做法是把
struct queue_node {
struct queue_node *next;
struct quque_node *prev;
void *data;
};
这样的节点暴露出来,让用户自己分配空间,问题是解决了,但总感觉用起来不够方便{:qq17:} lhd666 发表于 2017-04-19 14:07
回复 2# xinglp
我找了找别人写的代码,的确有不对malloc()返回作判断的;更多的做法是把
用户和你的接口在同一个程序里面,你觉得enqueue失败了,用户代码就能malloc成功了?
malloc分配的是虚拟空间地址,64位不存在失败的可能,具体可以看我之前问的这个帖子:《malloc到底会不会返回NULL?》
回复 4# lxyscls
谢谢!
我说暴露节点,问题解决,是指把包袱丢给调用者了{:qq26:} lhd666 发表于 2017-04-19 14:37
回复 4# lxyscls
谢谢!
你把内部实现暴露了,你哪天想改一下queue的内部实现就难了{:yct15:} 本帖最后由 lhd666 于 2017-04-19 15:15 编辑
回复 6# lxyscls
嗯,而且调用者还可能改动prev和next指针。
我对解耦这方面一直做得不好,常规的数据结构,因为学过,倒是好一点,其它方面总是做得有问题{:yct16:} kernel 里面的list.h还不好用吗? 回复 8# mr_sev
当然非常好用啊,是我目前见过的最好用的链表,但内核代码是GPL协议发布的,不能随便用啊,我一向是支持GPL的。
lhd666 发表于 2017-04-20 16:30
回复 8# mr_sev
当然非常好用啊,是我目前见过的最好用的链表,但内核代码是GPL协议发布的,不能随便用 ...
去看看 BSD的 queue.h,随便用。
页:
[1]
2