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