我試圖修改一些使用Linux內核中使用的C鏈接列表的代碼,例如fbida中使用的this one。但是我需要確實清除列表並從頭開始,我不確定最安全的方式。我也不能在網上找到一個例子。清除Linux內核鏈接列表
關於如何安全清除列表並釋放所有內存的任何想法?
我試圖修改一些使用Linux內核中使用的C鏈接列表的代碼,例如fbida中使用的this one。但是我需要確實清除列表並從頭開始,我不確定最安全的方式。我也不能在網上找到一個例子。清除Linux內核鏈接列表
關於如何安全清除列表並釋放所有內存的任何想法?
也許我找到了答案(數字...) 會像下面的工作?
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;
}
}
好吧,更具體地說,上面和你的實現有什麼區別,@cnicutar? – 2012-07-27 14:56:39
只有在使用malloc,calloc,realloc(或另一個兼容的分配例程)時,才應該調用free()。 MS有許多其他的不兼容。如果你轉向C++,你可以使用需要「刪除」來釋放的「新」。 – Les 2012-07-27 15:05:33
「最安全的方式」...「釋放內存」...引用的代碼沒有分配,完全取決於調用者/實現者分配內存。因此,調用者/執行者必須釋放分配的內存。
根據「cnicutar」,它僅僅是遍歷列表的工作,對每個找到的項目調用list_del()函數,然後釋放或刪除對象,具體取決於它如何分配。
爲什麼問題標記爲C++?只要[這個人](http://article.gmane.org/gmane.comp.version-control.git/57918)在這個問題上有任何發言權,你就不會在Linux內核中找到該語言。 – 2012-07-27 14:47:09
@MikeSeymour我認爲這是一個使用與Linux內核中使用的列表相似的實現的用戶級程序。 – cnicutar 2012-07-27 14:50:39
@cnicutar你是對的 – 2012-07-27 14:54:18