2012-05-14 3 views
0

free()의 두 가지 방법으로 연결된 목록 구조의 메모리가 malloc() 인데요. 다음 C 코드로 단일 링크 된 목록을 만들었다 고 가정합니다.C에서 연결된 목록 구조 Freeing에서의 혼란

Q1) 위의 잘못된/올바른 코드와 같이 메모리 할당 해제의 세 가지 방법 중 :

#include<stdio.h> 
#include<stdlib.h> 

struct node_type{ 
    int data; 
    struct node_type *next; 
    struct node_type *prev; 
} 
typedef struct node_type node; 
typedef struct node_type *list; 

void main(void){ 
    list head,node1,tail; 
    head=(list)malloc(sizeof(node)); 
    tail=(list)malloc(sizeof(node)); 
    node1=(list)malloc(sizeof(node)); 
    head->next=node1;tail->prev=node1; 
    node1->prev=head;node1->next=tail;node1->data=1; 

    /*Method-1 for memory de-allocation*/ 
    free(head->next->next); 
    free(head->next); 
    free(head); 

    /*OR*/ 

    /*Method-2 for memory de-allocation*/ 
    free(tail); 
    free(node1); 
    free(head); 

    /*OR*/ 

    /*Method-3 for memory de-allocation*/ 
    free(node1); 
    free(tail); 
    free(head); 
} 

지금, 나는 다음과 같은 질문이 있습니다.

Q2) 메모리 할당 해제를 위해 방법 1과 2에서 사용 된 것처럼 임의의 순서로 따라야합니다 (임의로 free()도 메모리가 좋습니까?

+2

3 개의 노드가있는 경우에만 작동합니다.이 작업을 수행하는 데 어떤 종류의 루프가 필요할 것입니다 아니? – Justin

+2

그리고 예수님의 이름으로 불쌍한'malloc()'의 반환 가치를 버리지 마라! –

+0

@ 카렙 아니, 그렇지 않아. 나는 C와 데이터 구조가 처음이다. 연결된 목록 DS를 구현하려고했지만 무료 사용이 확실하지 않았습니다. 그러므로 질문. – Abhinav

답변

2

표시된 모든 방법이 정확합니다. 할당 된 메모리에 대한 포인터가 다른 할당 된 메모리에있는 경우에만 특정 순서를 따라야하며, 컨테이너를 먼저 비우면 잃게됩니다. 예를 들어

, 할당을 위해 :

int ** ipp; 
ipp = malloc(sizeof(int*)); 
*ipp = malloc(sizeof(int)); 

올바른 free 순서가 될 것입니다 :

free(*ipp); 
free(ipp); 

하지 :

free(ipp); 
free(*ipp); // *ipp is already invalid 
+0

원한다면 다른 방법으로 자유롭게 할 수는 있지만 임시 변수에'ipp'를 먼저 저장해야합니다. 문제는 malloc/free에서 순서가 중요하지 않지만 메모리 블록에 대한 마지막 참조를 해제하면 더 이상 참조 할 수 없다는 것입니다. –

+0

@DavidHeffernan - 물론, 컨테이너에 ** ** 존재한다면 그렇게 말했습니다. – MByD

1

이러한 모든 방법이 정상적으로 작동합니다. malloc에 ​​의해 할당 된 메모리 블록을 원하는 순서대로 자유롭게 할 수 있습니다.

메모리를 할당 한 순서를 해제했을 때 그 순서가 바뀌어야한다고 생각해보십시오. 그렇게하면 목록의 중간에 항목을 삽입하거나 삭제할 수 없습니다. 유일한 동적으로 할당 된 데이터 구조는 푸시 다운 스택입니다.

0

여기에 무료로 간단한 방법 링크 된 목록, 머리부터. (참고로,이리스트의 끝 부분에 있다면 "next"는 NULL이된다고 가정합니다.)

node * it = head; 
while(NULL != it) { 
    node * tmp = it; 
    it = it->next; 
    free(tmp); 
} 
+0

답장을 보내 주셔서 감사 합니다만 링크 된 목록을 해제하는 방법과 해제 명령의 중요성을 알아야합니다. 하지만 귀하의 회신은 연결된 목록을 사용하는 방법을 배우는 다음 단계입니다. – Abhinav