尝试将文本文件加载到动态分配的二维数组时出现 bad_array_new_length 错误
Getting bad_array_new_length error when trying to load a text file into a dynamically allocated 2d array
所以我在使用这段代码时遇到的问题是,当我 运行 它时,我得到错误: terminate called after throwing an instance of "std:bad_array_new_length" what(): std:: bad_array_new_length
否则没有错误,代码编译得很好。下面是我要加载的文本文件:
10 8
0 255 255 255 0 0 255 255 255 0
255 0 255 255 0 0 255 255 0 255
255 255 0 255 255 255 255 0 255 255
255 255 255 0 255 255 0 255 255 255
255 255 255 355 0 0 255 255 255 255
255 255 255 255 0 0 255 255 255 255
255 255 255 0 255 255 0 255 255 255
0 0 0 255 255 255 255 0 0 0
前两个值 (10/8) 是长度(行)和高度(列),其余值将存储在二维数组中。
#include <iostream>
#include <fstream>
#include <string>
#include "image.h" // Has the prototypes for the functions
using namespace std;
int** load(string imageFile, int &length, int &height) {
int** array = new int*[length];
ifstream file(imageFile);
if(file.is_open()) {
file >> length; // Takes the first value and stores it as length
file >> height; // Takes the second value and stores it as height
for(int i = 0; i < length; i++) {
array[i] = new int[height];
for(int j = 0; j < height; j++) {
file >> array[i][j];
}
}
}
else {
cout << "Unable to open file." << endl;
return 0;
}
return array;
}
int main() {
int height, length;
int **image = load("../resource/imagecorrupted.txt", length, height);
}
我应该补充一点,这是一项家庭作业,因此我能做的事情非常有限。在 main 中,我确实需要将 load 中的值存储到 **image 中,以及为我设置的函数参数,并且是不可更改的。此外,它在 class 中还处于早期阶段,因此对于此作业,我们不希望使用结构或 classes 或类似的东西。谢谢你给我的任何help/advice!
编辑:
感谢@IgorTandetnik 与我讨论我的问题,我找到了解决方法。这个新代码有效,如果以后有人遇到同样的问题并需要帮助:
int** load(string imageFile, int &length, int &height) {
ifstream file(imageFile);
if(file.is_open()) {
file >> length;
int** array = new int*[length];
file >> height;
for(int i = 0; i < length; i++) {
array[i] = new int[height];
for(int j = 0; j < height; j++) {
file >> array[i][j];
}
}
return array;
}
else {
cout << "Unable to open file." << endl;
return 0;
}
}
int main() {
int height = 0;
int length = 0;
int **image = load("../resource/imagecorrupted.txt", length, height);
}
int** array = new int*[length]
此时,length
是一个未初始化的变量。您的程序表现出未定义的行为。
实际上,length
可能拥有非常大的垃圾值。尝试分配这么大的内存块失败。
所以我在使用这段代码时遇到的问题是,当我 运行 它时,我得到错误: terminate called after throwing an instance of "std:bad_array_new_length" what(): std:: bad_array_new_length
否则没有错误,代码编译得很好。下面是我要加载的文本文件:
10 8 0 255 255 255 0 0 255 255 255 0 255 0 255 255 0 0 255 255 0 255 255 255 0 255 255 255 255 0 255 255 255 255 255 0 255 255 0 255 255 255 255 255 255 355 0 0 255 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 255 255 0 255 255 255 0 0 0 255 255 255 255 0 0 0
前两个值 (10/8) 是长度(行)和高度(列),其余值将存储在二维数组中。
#include <iostream>
#include <fstream>
#include <string>
#include "image.h" // Has the prototypes for the functions
using namespace std;
int** load(string imageFile, int &length, int &height) {
int** array = new int*[length];
ifstream file(imageFile);
if(file.is_open()) {
file >> length; // Takes the first value and stores it as length
file >> height; // Takes the second value and stores it as height
for(int i = 0; i < length; i++) {
array[i] = new int[height];
for(int j = 0; j < height; j++) {
file >> array[i][j];
}
}
}
else {
cout << "Unable to open file." << endl;
return 0;
}
return array;
}
int main() {
int height, length;
int **image = load("../resource/imagecorrupted.txt", length, height);
}
我应该补充一点,这是一项家庭作业,因此我能做的事情非常有限。在 main 中,我确实需要将 load 中的值存储到 **image 中,以及为我设置的函数参数,并且是不可更改的。此外,它在 class 中还处于早期阶段,因此对于此作业,我们不希望使用结构或 classes 或类似的东西。谢谢你给我的任何help/advice!
编辑:
感谢@IgorTandetnik 与我讨论我的问题,我找到了解决方法。这个新代码有效,如果以后有人遇到同样的问题并需要帮助:
int** load(string imageFile, int &length, int &height) {
ifstream file(imageFile);
if(file.is_open()) {
file >> length;
int** array = new int*[length];
file >> height;
for(int i = 0; i < length; i++) {
array[i] = new int[height];
for(int j = 0; j < height; j++) {
file >> array[i][j];
}
}
return array;
}
else {
cout << "Unable to open file." << endl;
return 0;
}
}
int main() {
int height = 0;
int length = 0;
int **image = load("../resource/imagecorrupted.txt", length, height);
}
int** array = new int*[length]
此时,length
是一个未初始化的变量。您的程序表现出未定义的行为。
实际上,length
可能拥有非常大的垃圾值。尝试分配这么大的内存块失败。