fbida で使用されているこのコードのように、Linux カーネルで使用されている C リンク リストを使用するコードを変更しようとしています。しかし、実際にリストをクリアして最初からやり直す必要があり、それを行う最も安全な方法がわかりません。また、オンラインで例を見つけることもできません。
リストを安全にクリアしてすべてのメモリを解放する方法についてのアイデアはありますか?
「最も安全な方法」...「メモリを解放する」...参照されているコードは割り当てを行わず、メモリを割り当てるのは完全に呼び出し元/実装者次第です。したがって、呼び出し元/実装者は、割り当てられたメモリを解放する必要があります。
「cnicutar」によれば、リストを反復処理し、見つかった各アイテムに対して list_del() 関数を呼び出し、次にオブジェクトがどのように割り当てられたかに応じてオブジェクトを解放または削除するという単純な作業です。
多分私は答えを見つけました(数字...) 次のようなものはうまくいきますか?
void delete_all(struct list_head *head)
{
struct list_head *iter;
struct foo *objPtr;
redo:
__list_for_each(iter, head) {
objPtr = list_entry(iter, struct foo, list_member);
list_del(&objPtr->list_member);
free(objPtr);
goto redo;
}
}