【问题标题】:Heap corruption error when deleting array删除数组时出现堆损坏错误
【发布时间】:2013-02-19 10:17:57
【问题描述】:

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

合并排序功能:

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

【问题讨论】:

  • 除了使用newdelete 和流之外,我不会称之为C++。使用引用而不是指针来“通过引用”传递参数,并使用 std::vector 而不是原始数组。
  • 至于您的问题,请在调试器中运行,并逐行逐行执行代码,同时确保不覆盖数组的末尾。
  • 请注意(first+last)/2 会溢出——first + (last - first)/2 更安全。
  • 感谢您的回复,事实证明将 '(first+last)/2' 更改为 'first + (last - first)/2' 解决了堆损坏错误。但是,我的输出不正确。我得到的不是“1 2 3 4 5 6 7 8 9 10”,而是“-33686019 1 2 3 4 5 6 7 8 9”,其中第一个值已损坏。
  • 你需要通过调试器来解决这个问题。索引显然不在某处。

标签: c++ mergesort dynamic-arrays


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2013-06-04
    • 2019-08-28
    • 2015-09-30
    相关资源
    最近更新 更多