2010-12-15 6 views
1

나는 두 번 무료로 실행 중이며 어디서 그런 일이 일어나는 지 볼 수 없다. 다음 코드의 목적은 링크 된 목록에서 Person 노드를 삭제하는 것입니다. 당신은 사람을 자유롭게하는 경우C 더블 무료 문제

typedef struct person { 
    char *first ; 
    char *last ; 
    char *location ; 
    struct person *next_person ; 
} person ; 

struct person_list { 
    int num_persons ; 
    person *first_person ; 
} person_list ; 

extern struct person_list person_list ; 

void free_person(person *person) { 
    free(person->first); 
    person->first = NULL; 

    free(person->last); 
    person->last = NULL; 

    free(person->location); 
    person->location = NULL; 

    free(person); 
    person = NULL; 
} 

... 

    if (person_list.num_persons > 0) { 
     while (person_list.num_persons > 0) { 
      //Iterate to the end of the chain. 
      cur_person = person_list.first_person; 

      while (cur_person->next_person != NULL) { 
       cur_person = cur_person->next_person; 
      } 

      free_person(cur_person); 
      person_list.num_persons--; 
     } 
    } 

... 

답변

5

, 당신은 NULL에 이전 사람의 next_person 포인터를 설정하지 마십시오. 따라서 해제 된 메모리를 가리키며, 그 이유는 이중에서 해제하는 이유입니다.

무료로하고 싶은 사람을 계속 추적하고 next_person 포인터를 NULL으로 설정해야합니다.

같은 오류의 대상이되지 않습니다, 될 루프를 작성하는 또 다른보다 효율적인 방법 :

// Grab the first person 
    cur_person = person_list.first_person; 

    // Make sure there is someone to free 
    while (cur_person != NULL) { 
     // Keep track of who to free next 
     nxt_person = cur_person->next_person; 

     free_person(cur_person); 

     // Get the next person in line 
     cur_person = nxt_person; 
    } 

    // Didn't we just remove them all? Yes, we did. 
    person_list.num_persons = 0; 
    // Let's not forget to set that we have no one left 
    person_list.first_person = NULL; 
+0

그러나 free_person은 해당 사용자를 NULL로 설정합니다. 왜 그게 효과가 없습니까? – Mike

+2

pmg가 쓴대로 함수 내부에 로컬 복사본 만 설정합니다. 함수 외부에서 NULL로 설정하거나 참조 (C++ 기능이 아닌 C)를 전달해야합니다. – Wolf

+0

의미가 있습니다. 고맙습니다! – Mike

1
void free_person(person *person) { 
    /* ... */ 
    free(person); 
    person = NULL; 
} 

이는 NULL 로컬 person 설정; 호출 루틴에있는 사람에게는 아무런 변화가 없습니다.

1

free_person 함수에서 포함 구조를 해제하기 때문에 NULL에 대한 할당이 실제로 필요하지 않습니다. 그렇지 않으면 dangling pointer을 방지해야합니다.

또한 person = NULL은 반환 직후에 손실되는 함수의 로컬 매개 변수 만 할당합니다.