2012-07-27 5 views
2

fbida에서 사용 된 this one과 같이 Linux 커널에서 사용되는 C 연결 목록을 사용하는 일부 코드를 수정하려고합니다. 하지만 실제로 목록을 지우고 처음부터 시작할 필요가 있으며 가장 안전한 방법을 확신 할 수 없습니다. 온라인에서도 예제를 찾을 수 없습니다.Clear Linux Kernel Linked List

안전하게 목록을 지우고 모든 메모리를 확보하는 방법에 대한 아이디어가 있으십니까?

+0

질문에 C++ 태그가 붙은 이유는 무엇입니까? [이 사람] (http://article.gmane.org/gmane.comp.version-control.git/57918)이이 문제에 관해 어떤 말을하고있는 한 리눅스 커널에서 사용되는 언어는 찾을 수 없습니다. –

+0

@MikeSeymour 리눅스 커널에서 사용되는리스트와 비슷한 구현을 사용하는 유저 랜드 프로그램이라고 생각합니다. – cnicutar

+0

@cnicutar 당신이 맞습니다 –

답변

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? –

+0

malloc, calloc, realloc (또는 다른 호환 할당 루틴)을 사용하는 경우에만 free()를 호출해야합니다. MS에는 호환되지 않는 다른 많은 것들이 있습니다. 그리고 C++로 옮기면 "삭제"가 필요없는 "new"를 사용할 수 있습니다. – Les

0

"가장 안전한 방법"... "무료 메모리는"... 참조 된 코드는 더 할당하지 않습니다, 그것은 메모리를 할당하는 호출자/구현 개까지 완전히이다. 따라서 호출자/구현자는 할당 된 메모리를 해제해야합니다.

"cnicutar"에 따르면, 목록을 반복하면서 발견 된 각 항목에 대해 list_del() 함수를 호출 한 다음 할당 된 방법에 따라 객체를 해제하거나 삭제하는 작업입니다.

관련 문제