检测到堆损坏(C++)

Heap Corruption Detected (C++)

本文关键字:C++ 损坏 检测      更新时间:2023-10-16

我在合并排序方面遇到问题。我正在使用下面的代码,并且检测到堆损坏。当我试图释放内存时,就会发生这种情况,所以我会想象我在写一个越界的索引。

更具体地说,我认为这是循环的最后一步。当我打印出数组时,第一个索引是一些垃圾数字,而最后一个索引实际上是我想要的最后一个之前的索引。我已经试过了所有的方法,但我无法抽出时间来解决这个问题,有人能告诉我我到底做错了什么吗?"因为我似乎不明白问题出在哪里。

这是我正在使用的代码:

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

干杯。

问题就在这里:

T* temp = new T[right - left];
//...
for(int a = left; a <= right; a++) {
    arr[a] = temp [a-left];
}

您分配了right-left元素,但for循环会遍历right-left+1条目,因此您会用完数组的末尾,并占用一些不该占用的内存。如果您在for循环之后添加delete [] temp;(如果没有它,您将泄漏内存!),您可能会更早地看到错误。

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