在
linux/list.h的评论中写道:
>关于使用list_del_entry:注意:进入后的list_empty在此之后不返回true,该条目处于未定义状态.
>对于list_del:这仅适用于内部列表操作,我们已经知道了prev / next条目!
那么,我如何安全地从链表中删除一个对象并确保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);
}
解决方法
我想你误解了这些评论.第一个说list_empty(& entry-> list)不会返回true.但是,如果从列表中删除所有元素(这样做的方式是正确的)并执行list_empty(& mylist.list),结果会得到结果.
如果由于某种原因您希望将条目的struct list_head保持在内部一致状态,请使用list_del_init.
其次,__ list_del仅供内部使用,list_del是公平游戏.