2013-10-19 8 views
1

바이너리 검색 트리에서 삭제하려고하고 디버거 에서이 오류가 계속 발생하고이를 해결하기 위해 무엇을해야할지 모르겠습니다. 이 코드가 맞습니까?이진 검색 트리에서 삭제 하시겠습니까?

프로그램 수신 신호 EXC_BAD_ACCESS, 메모리에 액세스 할 수 없습니다. 이유 : KERN_INVALID_ADDRESS 주소 : 0x0000000000000000 0x00007fff8cc17fe2 표준에가 : 문자열 :: 비교()

void remove(const Comparable & x, BinaryNode *& t) 
{ 
    if (t != NULL) 
    { 
     if(t->element.find(x) != std::string::npos) 
     { 
      if(t->left != NULL && t->right != NULL) // Two children 
      { 
       t->element = findMin(t->right)->element; 
       remove(t->element, t->right); 
      } 
      else 
      { 
       BinaryNode *oldNode = t; 
       t = (t->left != NULL) ? t->left : t->right; 
       delete oldNode; 
       cout << "Successly deleted!" << endl; 
      } 
     } 
     if(x < t->element) 
     { 
      remove(x, t->left); 
     } 
     else 
     { 
      remove(x, t->right); 
     } 
    } 
    else 
    { 
     cout << x << "<-could not delete?" << endl;    
    }  
} 
+1

'address : 0x0000000000000000'은 NULL 포인터 역 참조 일 수 있습니다. 디버거를 사용하여 추적하십시오. –

답변

1

첫째, 디버거에서 다음 디버그 설정 실행을이 컴파일. 나는 모든 것을 보장 할 수 있습니다. 정확히 당신의 실패 사례는 어디로 갈 것입니까? 이 전에 당신의 논리는 다음과 같은 공제됩니다 어떤 이유

if(x < t->element) // <==== here 
{ 
    remove(x, t->left); 
} 
else 
{ 
    remove(x, t->right); 
} 

:

그 주에

, 나는이 라인 추측 null이

  • 어느 왼쪽 NOR 권리를
  • 만 왼쪽 또는 오른쪽이 null입니다.

둘 다 왼쪽과 오른쪽은 null입니다 (예 : 트리 리프 노드의 경우). 따라서이, 당신의 다른 조건에서 촬영 : 잎 노드의 경우

BinaryNode *oldNode = t; 
t = (t->left != NULL) ? t->left : t->right; 
delete oldNode; 
cout << "Successly deleted!" << endl; 

, 바로이 답변의 시작 부분에있는 코드에 의해 역 참조 널 (null)에 t 세트를 떠날 것이다.

이 작업을 수행하기 위해 논리를 다시 작성해야하며 역 참조 이전의 코드가 참조 해제되는 포인터를 무효화 할 수있는 경우 첫 번째을 확인해야합니다.

마지막으로 힌트가 잘못된 줄을 궁금해하는 경우 점점 보고서 문자열 비교가 null ptr을 역 참조하는 특정 오류가 발생합니다. 문자열 비교는 operator < 과부하를 통하는 경우를 제외하고이 함수의 다른 곳에서는 수행되지 않습니다.