mall(), free() 에 대한 질문입니다.
다음과 같은 구조체가 있습니다.
struct xmlTagNode{ struct xmlTagNode *parentNode; struct xmlTagNode *childNodes[50]; char *nodeName; char *nodeValue; int countOfChild; }xmlTagNode;
이 구조체를 하나로 노드로 해서 트리를 만들었습니다. 그리고 여기서 nodeName,nodeValue 는 malloc()을 사용해서 메모리를 할당해 주고 문자열을 집어 넣었습니다.
트리의 사용이 끝난후, 메모리를 반환 받는데 다음과 같이 코드를 작성하면 돌다가 죽어 버립니다.
int XmlTreeDestructor(struct xmlTagNode *source)
{
int i;
int ret;
if(source->countOfchild < = 0){
free(source->nodeName);
free(source->nodeName);
return 0;
}else{
for(i=0;icountOfChild ; i++){
ret = XmlTreeDestructor(source->childNodes[i]);
free(source->childNodes[i]);
}
source->countOfChild = 0;
}
return 0;
}
위 코드는 리프 노드에 도착하면 자기 노드의 엘리먼트들을 free() 시켜 준후, 부모 노드로 가서 자기 노드 자체를 free() 시켜 주는 순서입니다.
위와 같이 하면 세그멘테이션 오류가 발생합니다. 그래서 다음과 같이 수정했습니다.
int XmlTreeDestructor(struct xmlTagNode *source)
{
int i;
int ret;
if(source->countOfchild < = 0){
return 0;
}else{
for(i=0;icountOfChild ; i++){
ret = XmlTreeDestructor(source->childNodes[i]);
free(source->childNodes[i]->nodeName);
free(source->childNodes[i]->nodeName);
free(source->childNodes[i]);
}
source->countOfChild = 0;
}
return 0;
}
위와 같이 코드를 고치면 문제 없이 잘 돌아갑니다.
차이점이 무엇일까요?
첫 번째 소스의 if
첫 번째 소스의 if 끝에 semi-colon(;)이 아니라 brace({}를 붙혀 보세요.
일단은 여기서 시작...
근데... 보아하니...
두번째 소스도 brace가 제대로 안닫쳐 있군요.
소스 제대로 확인 하시고 다시 올려 주셔야 할듯...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <beer.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
댓글 달기