C++ 尝试打印/加载二维数组时出现分段错误

C++ 尝试打印/加载二维数组时出现分段错误,c++,multidimensional-array,io,segmentation-fault,text-files,C++,Multidimensional Array,Io,Segmentation Fault,Text Files,当我试着运行我的代码时,它编译没有问题。然而,当我尝试运行它时,我得到了行x:segmentation fault,x是错误应该出现的行,但是每次我尝试再次运行程序时,它都会改变+1,这似乎很奇怪。以下是相关代码: #include <iostream> #include <fstream> #include <string> #include "image.h" // Has the prototypes for the functions using n

当我试着运行我的代码时,它编译没有问题。然而,当我尝试运行它时,我得到了
行x:segmentation fault
,x是错误应该出现的行,但是每次我尝试再次运行程序时,它都会改变+1,这似乎很奇怪。以下是相关代码:

#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) {
    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];
                if(array[i][j] > 255 || array[i][j] < 0) {
                    cout << "Image is corrupted." << endl;
                    file.close();
                    return 0;
                }
            }
        }
        file.close();
        return array;
    }
    else {
        cout << "Unable to open file." << endl;
        return 0;
    }
}

void show(int **image, int length, int height) {
    cout << "The height of the matrix is: " << height << endl;
    cout << "The length of the matrix is: " << length << endl;
    cout << "The matrix is: " << endl;
    for(int i = 0; i < length; i++) {
        for(int j = 0; j < height; j++) {
            cout << " " << image[i][j]; 
        }
        cout << endl;
    }
}

int main() {
    int height = 0;
    int length = 0;
    int **image = load("../resource/imagecorrupted.txt", length, height);
    image = load("../resource/image.txt", length, height);
    show(image, length, height);
}
我主要做的是:

 int **image = load("../resource/imagecorrupted.txt", length, height);
 free(image, length, height);
 image = load("../resource/image.txt", length, height);

首先,内存泄漏。为了避免泄漏并有更好的边界检查,您应该考虑使用<代码> STD::vector < /代码>,而不是<代码> int * > /p> 你的崩溃是由于第二次失败。当第二次加载失败时,它返回0,即
nullptr
(在这种情况下,建议使用
nullptr
,而不是0)。稍后,
show
尝试取消引用此
nullptr
——导致分段错误

如果坚持使用原始指针,而不是向量或次优、唯一的\u ptr,则必须确保在
load
失败时,以及在连续成功调用
load
之间(以及最后)清除分配

编辑
第二个调用由于整数355而损坏。此外,您的列和行似乎发生了转置(行被视为列,列被视为行)。

首先,内存泄漏。为了避免泄漏并有更好的边界检查,您应该考虑使用<代码> STD::vector < /代码>,而不是<代码> int * > /p> 你的崩溃是由于第二次失败。当第二次加载失败时,它返回0,即
nullptr
(在这种情况下,建议使用
nullptr
,而不是0)。稍后,
show
尝试取消引用此
nullptr
——导致分段错误

如果坚持使用原始指针,而不是向量或次优、唯一的\u ptr,则必须确保在
load
失败时,以及在连续成功调用
load
之间(以及最后)清除分配

编辑
第二个调用由于整数355而损坏。此外,您的列和行似乎被转置(行被视为列,列被视为行)。

这不是分段错误的原因,而是您泄漏了分配的所有内存。最好使用
vector
而不是
int**
不是分段错误的原因,而是您泄漏了分配的所有内存。最好使用
vector
而不是
int**
谢谢@MichaelVeksler的回复!这是一个作业,我们还没有学习向量,虽然我相信如果我能使用它们,它们会更好。。。当您说我必须确保清除分配失败时,您的意思是
删除[]
它们还是其他什么?另外,您知道第二次加载失败的原因吗?我只是不明白为什么会这样。@Spago您应该
delete[]array[I]
为您分配的所有内部数组(如果出现故障,并非所有数组都被分配),最后您应该调用
delete[]array
@Spago第二次
load
由于输入中的某些内容而失败。如果看不到输入,就无法判断。我建议您将I、j与图像损坏一起打印。这会给你一个输入损坏的提示。那么我应该在main中的每个
加载之间调用
delete
函数吗?另外,我为丢失的输入道歉,我已经相应地编辑了上面的帖子@Spago删除与泄漏是另一个问题,因此它不会改善这个特定的分段错误,感谢@MichaelVeksler的响应!这是一个作业,我们还没有学习向量,虽然我相信如果我能使用它们,它们会更好。。。当您说我必须确保清除分配失败时,您的意思是
删除[]
它们还是其他什么?另外,您知道第二次加载失败的原因吗?我只是不明白为什么会这样。@Spago您应该
delete[]array[I]
为您分配的所有内部数组(如果出现故障,并非所有数组都被分配),最后您应该调用
delete[]array
@Spago第二次
load
由于输入中的某些内容而失败。如果看不到输入,就无法判断。我建议您将I、j与图像损坏一起打印。这会给你一个输入损坏的提示。那么我应该在main中的每个
加载之间调用
delete
函数吗?另外,我为丢失的输入道歉,我已经相应地编辑了上面的帖子@Spago删除与泄漏是另一个问题,因此它不会改善这种特定的分段错误
 int **image = load("../resource/imagecorrupted.txt", length, height);
 free(image, length, height);
 image = load("../resource/image.txt", length, height);