检测到堆损坏(C++)
Heap Corruption Detected (C++)
我在合并排序方面遇到问题。我正在使用下面的代码,并且检测到堆损坏。当我试图释放内存时,就会发生这种情况,所以我会想象我在写一个越界的索引。
更具体地说,我认为这是循环的最后一步。当我打印出数组时,第一个索引是一些垃圾数字,而最后一个索引实际上是我想要的最后一个之前的索引。我已经试过了所有的方法,但我无法抽出时间来解决这个问题,有人能告诉我我到底做错了什么吗?"因为我似乎不明白问题出在哪里。
这是我正在使用的代码:
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;
(如果没有它,您将泄漏内存!),您可能会更早地看到错误。
事实上,你所有的循环都走得太远了;这在这个简单的循环中是最明显的。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 正在调试 malloc():新内存损坏
- 变量周围的堆栈'sortArray'已损坏