2013-10-15 4 views
0

그래서 List 클래스의 구현을 시도하지만 삭제 기능을 수행하려고 할 때 포인터가 계속 비워 짐으로써 오류가 할당되지 않았습니다. 여기 List 클래스 구현 포인터를 사용한 메모리 할당 오류

내 기능 삭제()의 코드입니다 :
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop) 
{ 
    while (start<= stop) { 
    ListIterator<T> * temp = &start; 
    ++temp; 
    delete start.currentLink; 
    start.currentLink = temp->currentLink; 
    } 
} 

지금 나는 이미 내 링크 반복자 클래스를 테스트 한 그들은 내가 삽입처럼 다른 모든 일을 한 일을()와와 push_back(). 나는 어디에서 메모리 할당이 잘못되었는지 알 수 없었다. 올바른 방향으로 나를 가리킬 수있는 아이디어입니다.

답변

0

구현에 따르면 while 루프의 세 번째 반복에서 동일한 메모리 공간을 확보 할 수 있습니다 (두 개 이상의 요소를 비우는 경우 오류가 발생 함).

호선 : 임시 점

template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop) 
{ 
      while (start<= stop) { 
       ListIterator<T> * temp = &start; 
Line:1  ++temp; 
Line:2  delete start.currentLink; 
Line:3  start.currentLink = temp->currentLink; 
    } 
} 

는 ListClass A.link = 100 = {A, B, C}, B.link = 101, 102 = C.link

첫번째 반복을 고려

라인 2를 B로 : 당신은 무료로 100

3 호선을 : 당신이 지정 A.link = temp.link (I, E B.link) = 101

2 반복 :

호선 : 온도가 여전히

라인 2를 B로 점 : 당신 무료 101

3 호선 : 당신은 A.link = temp.link (I, E B.link) = (101)를 할당하는 이미

을 해제

3 반복

호선 : 온도는 여전히 같은 이놈의 B

라인 2를 가리키는 : 당신은 무료로 이미 0123을 해제 (101)--- 아마 GDB는 여기에 불만을

쉽게 고쳐 :

template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop) 
{ 
    ListIterator<T> * temp = &start; 
    while (start<= stop) { 
     ++temp; 
     delete start.currentLink; 
     start.currentLink = temp->currentLink; 
    } 
} 

더 나은 수정 :

template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop) 
{ 
    ListIterator<T> * temp = &start; 
    while (start<= stop) { 
     delete start.currentLink; 
     start++; 
    } 
    temp->currentLink = start.currentLink; 
} 

나뿐만 마지막 두 요소가 같은 currentLink이됩니다 삭제 기능에 대한 혼란 스러워요 있지만

(로 당신의 구현에서 추측 할 수있는 한).

희망이 도움이됩니다.

+0

감사합니다. 나는 지금 그것을 얻었고, 내가 이미 풀어 놓았던 메모리에 접근하려고 노력하고 있었다. 이것을 염두에두고 실제로 코드를 디버깅하는 새로운 방법을 보여 줬습니다! – user2881196

+0

당신은 오신 것을 환영합니다. 답변으로 귀하의 질문이 해결되면 대답으로 받아 들여주십시오. – fadedreamz