2012-03-20 5 views
0

* 강력한 텍스트 C는 다음과 같은 기능의 도움으로 경도라고에 나는 연결리스트를 만들어 * : 나는 번호 목록을 작성합니다 아이콘와 목록을 증가 다음 C에서 간단한 연결 목록의 메모리를 해제하는 2 가지 방법은 무엇입니까?

struct ilist_node { 
    struct ilist_node * rest; 
    int first; 
}; 

typedef struct ilist_node *ilist; 


ilist icons(int in, ilist il) { 
    ilist r = malloc(sizeof(struct ilist_node)); 
    r->first = in; 
    r->rest = il; 
} 

그 후 목록의 각 요소를 인쇄하고 목록에 사용 된 메모리를 해제하려고 시도했습니다.

while (lon!= NULL) { 
     ilist tmp = lon->rest; 
     printf(" %d\n",lon->first); 
     free(lon); 
     lon = tmp; 
    } 

위의 기능이 작동합니다. (나는 추억을 여는 방법을 봤어.이게 인기있는 대답 인 것 같다.) 그러나 호기심에서 나는 또 다른 것을 시도했다 :

ilist tmp = lon; 
    while (lon != NUll) { 
     printf(" %d\n",lon->first); 
     lon = lon->rest; 
    } 

    idelete(tmp); 

그리고 그것은 또한 작동한다. 그래서 나는 조금 혼란스러워. 마지막 노드가 작동하면 목록을 통해 모든 노드를 비울 필요가있는 이유는 무엇입니까?

+0

목록을 반복 재생하거나 해당 공간을 비우겠습니까? 만약 ideelte가 정말로 우리가 비교할 필요가 있다고 가정한다면, idelete의 출처도 올려주세요. – gbulmer

+0

ahhh 감사합니다. 그게 내 임명 idelete 대신 내장 된 대신 내 교수에 의해 주어진 사용하기 때문에 옙. 어리석은 실수 – x7qiu

+0

자주 묻는 질문에 도움이됩니다. -) – gbulmer

답변

2

idelete의 소스 코드가 표시 될 때까지는 말씀 드릴 수 없습니다. PITA가 될 위험이 있으므로 누구나 정확하게 의견을 말할 수 있다고 생각하지 않습니다.

idelete에 대한 출처가 필요합니다.

idelete

잘 작동 것

void idelete(ilist il) { 
    while (il!= NULL) { 
     ilist tmp = il->rest; 
     free(il); 
     il = tmp; 
    } 
} 

수 있습니다.

0

idelete()은 첫 번째 예제 (free())에서 사용하는 의미를 구현해야하며 모든 요소가 해제되어야합니다. 따라서 ideleteilist 유형에 대해 알고 있고 목록 요소 (목록 항목을 전달)에 대해 free을 내부적으로 호출 할 수 있으면 아무 문제가 없으며 누출이 발생하지 않습니다. 그런 경우가 아닌 경우

하지만, 내 아래에 원래의 문 (다른 답변) 적용


두 번째는 말 그대로 마지막/첫 번째 요소를 사용할 수있게됩니다 (당신이 순서를 고려하는 방법을 따라 연결된 목록의 요소 중 하나) - 상단에 ilist tmp = lon과 함께 할당 한 요소입니다. 작동하지만 메모리가 약간 누출됩니다.

이것이 Linux 나 유닉스 계열 시스템에서 지원되는 경우, 기본 도구 memcheck으로 Valgrind가 무엇을 말하고 있는지 확인할 것을 권장합니다.

관련 문제