删除数组时出现堆损坏错误

Heap corruption error when deleting array

本文关键字:损坏 错误 数组 删除      更新时间:2023-10-16

我正在尝试读取包含随机数列表的文本文件,并使用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;
}

问题似乎是您将数组分配为 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] 。这超出了数组范围。