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;
}
'new','delete'와 스트림을 사용하는 것 외에, 저는 C++이라고 부르지 않을 것입니다. 포인터 대신 참조를 사용하여 "참조로"인수를 전달하고 원시 배열 대신 ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)를 사용하십시오. –
문제에 관해서는 디버거에서 실행하고 배열 끝을 덮어 쓰지 않도록 한 줄씩 코드를 단계별로 실행하십시오. –
'(first + last)/2'는 오버 플로우 할 수 있습니다. 'first + (last-first)/2'는 더 안전합니다. – molbdnilo