2012-07-27 50 views
2

我試圖修改一些使用Linux內核中使用的C鏈接列表的代碼,例如fbida中使用的this one。但是我需要確實清除列表並從頭開始,我不確定最安全的方式。我也不能在網上找到一個例子。清除Linux內核鏈接列表

關於如何安全清除列表並釋放所有內存的任何想法?

+0

爲什麼問題標記爲C++?只要[這個人](http://article.gmane.org/gmane.comp.version-control.git/57918)在這個問題上有任何發言權,你就不會在Linux內核中找到該語言。 – 2012-07-27 14:47:09

+0

@MikeSeymour我認爲這是一個使用與Linux內核中使用的列表相似的實現的用戶級程序。 – cnicutar 2012-07-27 14:50:39

+0

@cnicutar你是對的 – 2012-07-27 14:54:18

回答

0

也許我找到了答案(數字...) 會像下面的工作?

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; 
    } 
} 
+0

好吧,更具體地說,上面和你的實現有什麼區別,@cnicutar? – 2012-07-27 14:56:39

+0

只有在使用malloc,calloc,realloc(或另一個兼容的分配例程)時,才應該調用free()。 MS有許多其他的不兼容。如果你轉向C++,你可以使用需要「刪除」來釋放的「新」。 – Les 2012-07-27 15:05:33

0

「最安全的方式」...「釋放內存」...引用的代碼沒有分配,完全取決於調用者/實現者分配內存。因此,調用者/執行者必須釋放分配的內存。

根據「cnicutar」,它僅僅是遍歷列表的工作,對每個找到的項目調用list_del()函數,然後釋放或刪除對象,具體取決於它如何分配。