2013-01-24 1 views
0

나는 심지어 head_new 노드를 확보 한 후 목록에이 특정 기능에서 제공되는 주요 기능의 값을 사용하여 동적으로free()를 적용한 후의 노드 값?

typedef struct list{ 
    int data; 
    struct list * link; 
} list; 

list * head = NULL; 
void release(list * head_new){ 
    list * dummy = NULL; 
    while(head_new != NULL){ 
    dummy = head_new->link; 
    printf("before freeing %p, %d", head_new->link, head_new->data); 
    free(head_new); 
    printf("free returns %p, %d", head_new->link, head_new->data); 
    head_new = dummy 
    } 
} 

할당 된 메모리를 해제하는 간단한 함수를 작성하려고했다, 일부 값은

인쇄
1 
12 
1 
123 
1 12 1 123 before freeing 00622A40, 1 
free returns 006200C4, 6433408 
before freeing 00622A60, 12 
free returns 006200C4, 6434048 
before freeing 00622A70, 1 
free returns 006200C4, 6433344 
before freeing 00000000, 123 
free returns 00000000, 123 

마지막 두 줄은 같은 값의 데이터를 반환합니다. 심지어 큰 목록으로 시도했습니다. 같은 일이 일어난다! 마지막으로 2,3 개의 값 (즉, head_new-> data)이 그대로 반환됩니다. 내 질문 : 이것은 일종의 버그입니까? 또는 그러한 값을 갖는 것이 정상입니까? 반환 유형이 공짜가 아니기 때문에이 점에 관심이 있습니다. 그런 다음 어떻게 동일한 값을 표시 할 수 있습니까? 의심의 여지가 없도록 도와주세요.

답변

2

다른 데이터에 의해 무시 될 때까지 값이 있습니다.

자유롭게 할 때 일어나는 유일한 일은 메모리가 무료 풀에 다시 놓여 지므로 다른 사람에게 주어 지도록 요청하는 것입니다.

+0

오 .. 그런데 처음 2-3 개의 값이 변경되는 이유는 무엇입니까? 그리고 head_new를 해제 한 후, 어디에서 가리 킵니까? 바로 다음 문장에서 유효성 검사를 정당화 할 수 있습니까? head_new = dummy; – Hemant

6
free(head_new); 
printf("free returns %p, %d", head_new->link, head_new->data); 

정의되지 않은 동작 (UB)를 가지고 프로그램을 일으킴. free 포인터를 호출하면 head_new 포인터를 참조 해제하려고 시도하면 정의되지 않은 동작이 발생합니다.
UB는 프로그램이 작동을 표시 할 수 있음을 의미하며 충돌을 일으킬 필요가 없음을 의미합니다. SImply는 역 참조가 잘못되었다고 말하면 안됩니다.

무엇이 장면 뒤에서 일어날 수 있습니까?

free은 단지 reusage 무료을 표시하는 할당이 해제 된 메모리를 다시 초기화하지 않습니다.
주소의 내용이 여전히 동일하고 포인터를 파생하면 해당 내용이 제공됩니다. 그러나 UB가 포인터를 참조 해제 한 순간에 UB가 발생했기 때문에 중요하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 한 가지 더 명확히 해주세요. 바로 다음 행에서 head_new = dummy를 사용했습니다. head_new가 더미와 동일한 위치를 가리킬 것임을 의미합니다. 어떻게 작동합니까? free가 head_new를 null로 만듭니다. 더 명확히하기 위해 나는이 무료 함수가 head_new에 어떤 영향을 미치는지 물어보고 싶다. 이 변수를 null과 같게 만들까요? 삭제 되나요? 아니면 그냥 쓰레기 값을 포함 할 것인가? 자유 함수가 힙에서 가져온 memomry를 반환하기 때문에 어떻게 head_new가 여전히 memomry 위치를 가리킬 수 있습니까? – Hemant

+0

@Hemant : free는'head_new'를'NULL'로 만듭니다. 'free'는 단순히 런타임에 메모리 위치를 할당되지 않은 상태로 취급하고 사용을 위해 무료로 취급합니다. 그 이상은 아닙니다. –

+0

다음 wat_headewnew에 happends ?! 그래서 그것은 매달려있는 포인터가됩니까? 죄송합니다 .. 내 포인터 개념에 분명하지 않은 것 같아요. ( – Hemant