2013-02-19 3 views
0

임의의 숫자 목록이 들어있는 텍스트 파일을 읽고 mergesort를 사용하여 표시하려고 시도하고 있습니다. 숫자는 동적 배열로 읽혀집니다. 불행히도, 사용하지 않는 배열을 삭제하려고 시도 할 때마다 힙 손상 오류가 감지됩니다.배열을 삭제할 때 힙 손상 오류가 발생했습니다.

머지 소트 기능 : 내가 tempArr을 삭제할 때

void mergesort(int *arr, int first, int last) 
{ 
if(first < last) 
    { 
    int middle = ((first + last)/2); 
    mergesort(arr, first, middle); 
    mergesort(arr, middle+1, last); 
    merge(arr, first, last); 
    } 
} 

오류가 병합 기능에서 발생이 :

void merge(int *arr, int first, int last) 
{ 
int *tempArr = new int[last]; 

int mid = (first+last)/2; 
int first1 = first; 
int last1 = mid; 
int first2 = mid + 1; 
int last2 = last; 

int index = first1; 

for(; (first1 <= last1) && (first2 <= last2); ++index) 
{ 
    if (arr[first1] < arr[first2]) 
    { 
     tempArr[index] = arr[first1]; 
     ++first1; 
    } 
    else 
    { 
     tempArr[index] = arr[first2]; 
     ++first2; 
    } 
} 

for(; first1 <= last1; ++first1, ++index) 
    tempArr[index] = arr[first1]; 

for(; first2 <= last2; ++first2, ++index) 
    tempArr[index] = arr[first2]; 

for(index=first;index<=last;++index) 
    arr[index] = tempArr[index]; 

delete [] tempArr; 
} 
+1

'new','delete'와 스트림을 사용하는 것 외에, 저는 C++이라고 부르지 않을 것입니다. 포인터 대신 참조를 사용하여 "참조로"인수를 전달하고 원시 배열 대신 ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 사용하십시오. –

+3

문제에 관해서는 디버거에서 실행하고 배열 끝을 덮어 쓰지 않도록 한 줄씩 코드를 단계별로 실행하십시오. –

+1

'(first + last)/2'는 오버 플로우 할 수 있습니다. 'first + (last-first)/2'는 더 안전합니다. – molbdnilo

답변

6

문제는 당신이 int *tempArr = new int[last]로 배열을 할당 것 같다. 해당 요소의 수는 last이고 인덱스는 0, 1, ... last - 1입니다.

for(; first2 <= last2; ++first2, ++index) 
    tempArr[index] = arr[first2]; 

last2last의 값으로 초기화됩니다 : 함수의 끝 부분

, 당신이 있습니다. 즉, 루프의 최종 할당은 index == last 일 때이므로 tempArr[last]에 액세스합니다. 배열 범위를 벗어났습니다.