c – linux / list.h – 如何安全地从列表中删除项目?

前端之家收集整理的这篇文章主要介绍了c – linux / list.h – 如何安全地从列表中删除项目?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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是公平游戏.

猜你在找的C&C++相关文章