堆损坏在 C++ 中检测到错误
Heap corruption detected error in C++
这是我的代码:
#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;
}
当我运行这段代码时,它说存在堆损坏错误(检测到堆损坏)。我认为这意味着我的代码中 'new' 或 'delete' 部分有一些错误,但我找不到它们。希望有人解答。谢谢。
在代码的许多地方,您使用从 0 到 5 的索引为 big
数组编制索引,而数组是使用用户输入分配的,例如,如果用户输入是 4
,你的代码是未定义的行为。
如果您使用的是 C++,则不应手动分配数组,而是使用 std::vector
,它会为您管理内存,因此您不必 new
和 delete
自己记忆。
使用 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
方法获取数组元素的数量。
错误在这里:
big = new int[num];
...
for (int i = 0; i < 5; i++) {
big[i] = 0;
}
所以当你 num
小于 5 时你在数组外写。
无论如何,您使用的是 C++,因此请使用 vector 来完成此类任务。
#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;
}
这是我的代码:
#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;
}
当我运行这段代码时,它说存在堆损坏错误(检测到堆损坏)。我认为这意味着我的代码中 'new' 或 'delete' 部分有一些错误,但我找不到它们。希望有人解答。谢谢。
在代码的许多地方,您使用从 0 到 5 的索引为 big
数组编制索引,而数组是使用用户输入分配的,例如,如果用户输入是 4
,你的代码是未定义的行为。
如果您使用的是 C++,则不应手动分配数组,而是使用 std::vector
,它会为您管理内存,因此您不必 new
和 delete
自己记忆。
使用 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
方法获取数组元素的数量。
错误在这里:
big = new int[num];
...
for (int i = 0; i < 5; i++) {
big[i] = 0;
}
所以当你 num
小于 5 时你在数组外写。
无论如何,您使用的是 C++,因此请使用 vector 来完成此类任务。
#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;
}