8

在评论中linux/list.h写道:

  1. On using list_del_entry: 注意:list_empty在此之后,on entry 不会返回 true,该条目处于未定义状态。
  2. For list_del这仅适用于我们已经知道上一个/下一个条目的内部列表操作!

那么,我将如何安全地从链表中删除一个对象并确保它list_empty正常工作或确保下一个链表节点删除是正确的?

这是我目前的实现:

struct kool_list{
    int to;
    struct list_head list;
    int from;
};

struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist;

list_for_each_safe(pos, q, &mylist.list){
         tmp= list_entry(pos, struct kool_list, list);
         printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
         list_del(pos);
         free(tmp);
}
4

1 回答 1

6

我想你误解了评论。第一个说这list_empty(&entry->list)不会返回true。但是,如果您从列表中删除所有元素(您的操作方式是正确的)并且list_empty(&mylist.list)您会得到 true 的结果。

如果出于某种原因您希望将条目保持struct list_head在内部一致的状态,请使用list_del_init.

其次,__list_del仅供内部使用,list_del是公平的游戏。

于 2013-03-11T10:41:36.063 回答