연결리스트에서 메모리 에러...
글쓴이: sadrove / 작성시간: 목, 2003/10/23 - 3:56오후
//존재하는 노드의 개수를 비교하는 프로그램
void List::nodeLength()
{
int cntLength=0;
ListNode *t;
t = first;
while(1){
cntLength++;
cout << t->link;
if(!t->link) break; //마지막 노드(마지막 노드는 link가 0)이면 카운트 정지
t = t->link;
}
cout << "Node Length = " << cntLength << endl;
delete t;
}
위 소스는 연결리스트에서 노드의 개수를 알아내는 함수인데요..
메인에서 node1.nodeLength();
이런식으로 호출하면 정상적으로 노드의 개수를 출력합니다..
근데 이상한건 두번 호출하면 즉 아래와 같이..
node1.nodeLength(); node1.nodeLength();
두번째 호출되는 부분에서 메모리 위반이라는 에러가 나옵니다..
디버그로 두번째 호출되는 부분의 first의 메모리 위치를 확인했는데..
첫번째 함수가 호출되는 부분과 같더군요..
어디서 메모리 위반이 일어나는 걸까요...ㅠ.ㅠ...
Forums:


[code:1]void List::nodeLength&
void List::nodeLength() { int cntLength=0; ListNode *t; t = first; while(1){ cntLength++; cout << t->link; if(!t->link) break; //마지막 노드(마지막 노드는 link가 0)이면 카운트 정지 t = t->link; } cout << "Node Length = " << cntLength << endl; // delete t; }이렇게 수정하세요
노드 확인후 다른곳에서 저 노드를 죽여야 합니다.
지금은 단지 확인으로 메모리 주소만 대입했으니 굳이 안죽여도 됩니다.
메모리 leak도 날 이유가 없구요
그럼[/list][/code]
답변 감사드립니다...
답변 감사합니다..
님의 말씀대로 하니까 괜찮네요...^^
그런데 사실 잘 이해가 안갑니다..
왜 delete를 하면 에러가 나는건지....
괜찮으시다면 자세히 설명 좀 해주실 수 있을까요...
좋은 하루 되세요..
delete 를 하면 2번째 호출에서 에러가 나는게 당연합니다.처
delete 를 하면 2번째 호출에서 에러가 나는게 당연합니다.
처음 List::nodeLength() 를 호출했을 때
delete t;
를 실행할 때 t 는 리스트의 마지막 노드를 가리키고 있습니다.
그런데 이걸 삭제해 버리니 리스트의 구조가 깨지게 됩니다.
(삭제한 노드 바로앞의 노드가 새로운 끝이 되겠지만 그것의 link가
null이 아니므로 두번째 호출에서 재참조하려다가 오류가 나는 것입니다.)