2014-09-15 3 views
2

이 솔루션으로 연결 목록 할당을 해제 할 수 있습니까? 목록에 할당 된 메모리가 해제되었는지 어떻게 확인할 수 있습니까?연결 목록 할당 해제

void freeList(EmpList** listHead) 
{ 
    EmpList* iter = *listHead; 
    while(iter != NULL) 
    { 
     iter = iter->next; 
     free(*listHead); 
     *listHead = iter; 
    } 

} 

다음은 구조체

typedef struct employeeData 
{ 
    int EMP_ID; 
    char name[21]; 
    int dept; 
    int rank; 
    double salary; 
} Employee; 

typedef struct empList 
{ 
    Employee employee; 
    struct empList* next; 
} EmpList; 
+0

왜 함수에'EmpList * *'(포인터에 대한 포인터)를 넘겨 줍니까? – 5gon12eder

+0

호출자가'EmpList * head'를 정의한 다음'head'를'freeList (& head) '를 호출하여'NULL'로 자동 설정하도록 할 수 있다고 생각합니다.) – nneonneo

+0

내 구현에서는 i가 그랬다고 말하지 않았습니다. 맞습니다 그래서 뭔가 잘못 말하면 제발 listhead를 바꾸려면 포인터 머리부터 포인터가 필요합니다. 목록 헤드에서 데이터를 역 참조하는 것이 아니라 목록을 가리키는 포인터입니다. 그리고 네오가 말한 것 – Thomas

답변

3

당신은 는 Valgrind의 같은 메모리 검사기를 사용하여 메모리를 해제한다을 확인할 수 있습니다. 메모리 검사기는 메모리가 매달려 있으면 프로그램 실행이 끝날 때 알려줍니다. 또한 Valgrind는 다양한 메모리 오용 (배열 끝에서 해제, 할당 해제 된 메모리, 초기화되지 않은 메모리 및 더 많은 기능 사용)을 확인할 수 있습니다.

구현에 관해서는 매우 합리적입니다.

+0

감사합니다. Valgrind가 유용하다고 생각합니다. LOL은 파일을 닫지 않은 것을 잊어 버리면 알려줍니다. – Thomas

+1

그렇습니다! 전체 옵션 목록은 http://valgrind.org/docs/manual/manual-core.html을 참조하십시오. 원하는 파일은'--track-fds'입니다. – nneonneo

+0

neo ive 내가 valgrind를 실행할 때 잘못된 8 크기의 쓰기/읽기가 잘못되었습니다. 프로그램이 끝나면 힙 스택은 0이라고 표시됩니다. – Thomas