尝试将文本文件加载到动态分配的2d数组中时出现bad_array_new_length错误

时间:2019-02-19 00:52:00

标签: c++ multidimensional-array text-files bad-alloc

所以这段代码的问题是,当我运行它时,出现错误: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)是长度(行)和高度(列),其余两个值应存储在2d数组中。

#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);
}

我应该补充一点,这是用于家庭作业,因此我在可以做的事情上受到很大限制。在主要方面,我确实需要存储从加载到**图像中的值,以及为我设置的功能参数,并且这些参数不可更改。而且,它还处于类的早期,因此对于本次作业,我们不希望使用结构或类之类的东西。感谢您可以给我的任何帮助/建议!

编辑:

由于@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);
}

1 个答案:

答案 0 :(得分:1)

int** array = new int*[length]至此,length是一个未初始化的变量。您的程序表现出未定义的行为。

实际上,length可能具有非常大的垃圾值。尝试分配这么大的内存会失败。