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