8

コメントには次のlinux/list.hように書かれています。

  1. 使用list_del_entry時: 注:list_emptyこの後、エントリがtrueを返さない場合、エントリは未定義の状態になります。
  2. For 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);
}
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 に答える