링크리스트 구현에서 메모리할당과 해제에 대해서요..
글쓴이: waltherppk / 작성시간: 토, 2003/06/28 - 9:58오후
이번에도 링크리스트 구현코드에서 의문점입니다.
코드 출처는 [Algorithm with C -O'Rielly- 번역판] 입니다.
typedef struct ListElmt_ { void *data; struct ListElmt_ *next; } ListElmt;
이 리스트요소 구조체를 리스트에 추가할때
if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL) { return -1; }
형태로 메모리를 할당하는데요...
이때 void *data 에도 메모리가 할당되는 건가요 ?
이것을 해제하기위해서
free(new_element)
만으로는 ListElmt 의 void *data 때문에 메모리가 모두 해제되지 않는 건가요 ?
읽어주셔서 감사합니다.
(^^) (__) 꾸벅
Forums:
void* data; 에는 단순히 주소공간을 위한 4byte(32bitO
void* data; 에는 단순히 주소공간을 위한 4byte(32bitOS/Compiler)만을
할당합니다.
free를 해도 단순히 void* data의 4byte영역만 해체될 뿐,
data가 가르키고 있는 메모리 위치는 해체되지 않습니다.
만약 data가 new나 malloc으로 생성한 어떠한 객체라면,
해체할 때 반드시, free(new_element->data)와 같은
구문으로 해체해줘야 합니다.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
그건 아닌거 같은데요
포인터 부분를 힙에 할당한거 같은데요
포인터에다가 할당한것을 free 한다기보단
포인터 자체를 메모리에 할당한거 같습니다
free는 그렇게 해주는게 맞을거 같은데요 --;
그리고 위에 코드는 void*에다가 메모리 할당을 했다기 보단
void* 포인터 자체를 힙 메모리에 할당한걸로 봐지네요
위 코드에는 void* 포인터에 메모리를 할당하지 않은걸로 가정한거고요
만약 할당했다면
먼저 void* 포인터의 메모리 해제후에
free(new_element) 하면 될거 같습니다
단 그러면 당연히 포인터 자체가 날아가므로 링크드 리스트에서는
next 포인터를 조정 해줘야 겠죠
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
답변 고맙습니다.(^^) (__) 꾸벅
답변 고맙습니다.
(^^) (__) 꾸벅
댓글 달기