在C++中检测到堆损坏错误

Heap corruption detected error in C++

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

这是我的代码:

#include<iostream>
#include<cstdlib>
using namespace std;
int main() {
int** arr=NULL;
int num=0;
cin >> num;
int* big=NULL;
arr = new int*[num];
for (int i = 0; i < num; i++) {
arr[i] = new int[5];
}
big = new int[num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < 5; j++) {
while (1) {
cin >> arr[i][j];
if (arr[i][j] >= 0 && arr[i][j] < 100)
break;
}
}
}
for (int i = 0; i < 5; i++) {
big[i] = 0;
}
for (int i = 0; i < num; i++) {
for (int j = 0; j < 5; j++) {
if (big[i] < arr[i][j]) {
big[i] = arr[i][j];
}
}
}
for (int i = 0; i < num; i++) {
cout << "Case #" << i + 1 << ": " << big[i] << endl;
}
delete[]big;
for (int i = num-1; i>=0; i--) {
delete[]arr[i];
}
delete[]arr;
return 0;
}

当我运行此代码时,它说存在堆损坏错误(检测到堆损坏(。我认为这意味着我的代码中的"新"或"删除"部分存在一些错误,但我找不到它们。我希望有人回答。谢谢。

错误在这里:

big = new int[num];
...
for (int i = 0; i < 5; i++) {
big[i] = 0;
}

因此,当您num少于 5 个时,您将在数组之外写入。

无论如何,您正在使用C++因此请使用矢量来完成此类任务。

#include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;
int main() {
vector<vector<int>> arr;
int num=0;
cin >> num;
arr.resize(num, vector<int>(5));
for (auto &row : arr) {
for (auto &cell : row) {
while (1) {
cin >> cell ;
if (cell >= 0 && cell < 100)
break;
}
}
}
vector<int> big(arr.size());
for (int i = 0; i < arr.size(); i++) {
for (auto &cell : arr[i]) {
if (big[i] < cell) {
big[i] = cell;
}
}
}
for (int i = 0; i < num; i++) {
cout << "Case #" << i + 1 << ": " << big[i] << endl;
}
return 0;
}

在代码中的许多地方,您使用 0 到 5 的索引为big数组编制索引,而数组是使用用户输入分配的,例如,如果用户输入4,则代码是未定义的行为。

如果您使用的是 c++,则不应手动分配数组,而应使用std::vector,它将负责为您管理内存,因此您不必自己newdelete内存。

使用std::vector,您的代码将看起来像这样。

std::vector<std::vector<int>> arr;
std::vector<int> big;
cin>>num;
arr.resize(num, std::vector<int>(5));
big.resize(5);

您还可以使用at方法在边界检查时访问元素,并使用size方法来获取数组的元素数。