检测到堆腐败(C ++)

时间:2014-10-21 03:02:56

标签: c++ arrays heap corruption

我遇到合并排序问题。我正在使用下面的代码,并且我检测到了堆损坏。当我尝试释放内存时会发生这种情况,所以我想我会编写一个超出范围的索引。

更具体地说,我认为它是最后一个for循环。当我打印出数组时,第一个索引是一些垃圾编号,最后一个索引实际上是我想要的最后一个索引。我已经尝试了所有的东西而且我无法解决这个问题,有人可以告诉我,我做错了什么吗? '因为我似乎无法理解问题所在。

以下是我使用的代码:

template <class T>
int Mergesort(T arr[], int n) {
  MergeSortRec(arr, 0, n, n);
  return 0;
}

template <class T>
void MergeSortRec(T arr[], int left, int right, int size) {
 if(right > left) {
  int mid = ((left + right) /2);

  MergeSortRec(arr, left, mid, size);
  MergeSortRec(arr, mid+1, right, size);
  Merge(arr, left, mid, right, size);
 }
 return;
}

template <class T>
void Merge(T arr[], int left, int mid, int right, int size) {
 int i = 0;
 int j = left;
 int k = mid + 1;

 T* temp = new T[right - left];

 while(j <= mid && k <= right) {
  if(arr[j] < arr[k]) {
   temp[i++] = arr[j++];
  } else {
   temp[i++] = arr[k++];
  }
 }

 while(j <= mid) {
  temp[i++] = arr[j++];
 }

 while(k <= right) {
  temp[i++] = arr[k++];
 }

 for(int a = left; a <= right; a++) {
  arr[a] = temp [a-left];
 }

干杯。

1 个答案:

答案 0 :(得分:3)

问题在于:

T* temp = new T[right - left];

//...

for(int a = left; a <= right; a++) {
    arr[a] = temp [a-left];
}

您分配right-left元素,但for循环逐步执行right-left+1个条目,因此您将运行数组的末尾并践踏您不应该的某些内存。如果你在delete [] temp;循环之后添加了for(没有它就会泄漏内存!),你可能会更早地看到你的错误。

事实上,你所有的循环都走得太远了;它在这个简单的循环中最为明显。