2013-03-31 6 views
0

바이너리 검색 트리를 작성했지만 정상적으로 작동하지만 내 프로그램이 모든 메모리를 해제하는지 확신 할 수 없습니다.C를 사용하여 이진 트리를 해제하는 방법은 무엇입니까?

여기에 나무 I 출력이 기능을 결과하고 무료 모든 노드를 쓰기

typedef struct node { 
    int val; 
    struct node *left, *right; 
} nodeOfTree; 

의 노드의 나의 정의, 대답은 잘하지만 메모리가 해제되지 않는 것 같다.

void outputAndDestroyTree(nodeOfTree *root) { 
    if (!root) {return;} 
    outputAndDestroyTree(root->left); 
    printf("%d ", root->val); 
    outputAndDestroyTree(root->right); 
    free(root);  // I free this pointer, but after doing that, I can still access this pointer in the main() function 
} 

다시 말해서 재귀 함수에서 추억을 풀 수는 없습니까?

업데이트 ~~~~~ 주셔서 감사합니다 : 여러분 모두 감사합니다 ~

+1

메모리가 해제되지 않은 것을 어떻게 알 수 있습니까? 무료 란 데이터를 덮어 써야한다는 것을 의미하지는 않습니다. – Wiz

+1

'free'로, 당신은 무언가를 파괴하지 않고 있습니다. 메모리 영역과 데이터는 여전히 '사용되지 않음'으로 표시되어 있습니다. – Jokester

+0

미리 할당 된 메모리 덩어리에 트리 노드를 저장하면 하나의'free()'로 전체 트리를 파괴 할 수 있습니다. 일종의 간단한 메모리 관리. 그러나 다른 사람들이 이미 지적했듯이 '자유'는 해방 된 * 메모리의 내용을 없애지는 않습니다. 단지 다른 할당에 사용 가능하게 만듭니다. – liuyu

답변

5

귀하의 코드는 괜찮아 보이지만, 할당 된 메모리를 해제하는 마술이 NULL 참조 포인터의 설정하지 않습니다. 포인터에 새 값을 설정하지 않았으므로 이전 주소는 그대로 유지됩니다. 아마도 정의되지 않은 동작 임에도 불구하고 충돌없이 읽을 수 있습니다.

메모리를 확보 한 후 NULL으로 설정하려면 다음과 같이하십시오. outputAndDestroyTree(root->left);으로 전화 한 다음 root->left = NULL;으로 전화하십시오.

관련 문제