2013-02-19 45 views
0

我正在尝试读取包含随机数列表的文本文件,并使用mergesort对其进行排序以显示。数字被读入到一个动态数组中。不幸的是,每当我尝试删除未使用的数组时,都会检测到堆损坏错误。删除数组时发生堆损坏错误

归并功能:在发生合并功能

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); 
    } 
} 

错误,当我删除tempArr:

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)而不是原始数组。 – 2013-02-19 10:23:46

+3

至于你的问题,在调试器中运行它,然后逐行执行代码,同时确保不覆盖数组的末尾。 – 2013-02-19 10:24:30

+1

注意'(first + last)/ 2'可以溢出 - 'first +(last - first)/ 2'比较安全。 – molbdnilo 2013-02-19 10:30:16

回答

6

这个问题似乎是,你分配你的数组作为int *tempArr = new int[last]。其元素的数量是last,它们的指数是0,1,... last - 1

接近函数结束时,你有这样的:

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

last2被初始化到last值。这意味着循环中的最终分配将在index == last时发生,因此您正在访问tempArr[last]。这超出了数组范围。