C++ C++;错误:在抛出';的实例后调用terminate;std::bad#u alloc';
我编写了粘贴在下面的代码,以便按照声明的顺序执行以下任务:C++ C++;错误:在抛出';的实例后调用terminate;std::bad#u alloc';,c++,C++,我编写了粘贴在下面的代码,以便按照声明的顺序执行以下任务: 读取输入文件并计算其中的条目数 创建适当大小的数组(大小等于条目数) 返回到输入文件的开头并再次读取 将条目存储在数组中 打印出文件中的条目数和条目本身 这是我的密码: #include <iostream> #include <fstream> #include <exception> using namespace std; int main(int argc, char* argv[]){
#include <iostream>
#include <fstream>
#include <exception>
using namespace std;
int main(int argc, char* argv[]){
ifstream inFile(argv[1]); //passing arguments to the main function
int numEntries;
if(!inFile){
cout << "file not found" << endl;
return 1;
}
string entry;
while (!inFile.eof()){ //counting the number of entries
getline(inFile,entry);
++numEntries;
}
const int length = numEntries; //making an array of appropriate length
int*arr = new int[length];
inFile.clear(); //going back to the beginning of the file
inFile.seekg(0, ios::beg);
int i = 0;
const int size = numEntries; //making an array to store the entries in the file
int matrix[size];
int pos = 0;
int variable = 0;
while(pos < size){
inFile >> variable;
matrix[pos] = variable;
++pos;
}
cout<< numEntries << "entries have been read"<< endl;
inFile.close();
for(int i = 0; i < pos; ++i)
cout << matrix[i] << endl; //printing out the entries
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
ifstream infle(argv[1]);//将参数传递给主函数
国际货币基金组织;
如果(!infle){
cout变量;
矩阵[pos]=变量;
++pos;
}
cout此代码有3个孔:
第一个孔:int-numEntries
。之后您可以:++numEntries;
您增加了未指定的值。不确定它是否为UB,但仍然不正确
第二个和第三个孔:
const int length = numEntries;
int* arr = new int[length];
及
numEntries
具有未指定的值(第一个孔)。您可以使用它初始化长度
和大小
-这是未定义的行为。但让我们假设它只是一个大数字-您分配未指定大小的内存(可能只是非常大的大小)因此出现了std::bad_alloc
异常-这意味着您希望分配更多可用内存
此外,matrix
是未指定大小的VLA
,这是非标准和未定义的行为。失去焦点,浪费30分钟:
class Cls1{
int nV; // <------------- nV is un-initialized
vector<bool> v1;
public:
Cls1 () {
v1 = vector<bool> (nV + 1, false); // <------------------ nV is used
}
};
Cls1类{
int nV;//您的程序表现出未定义的行为。numEntries
从未初始化。它包含随机垃圾-可能是一个非常大的数字。解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题将包括一个重现您的问题的示例,以及您在调试器中所做的观察。如果您经常无法初始化数据,则应切换到Windows/Visual Studio。Visual Studio具有静态代码分析功能,可以轻松捕获这类错误。这不是问题,但此代码有太多的间接错误ion.去掉长度
和大小
;只需在这两个位置使用numEntries
(在修复@igortandtnik指出的错误之后)。去掉变量
,直接读取矩阵[pos]
。此外,无需关闭输入文件。流的析构函数将执行此操作。为什么不使用std::vector
只读取一次文件,然后将每个条目推回它?这样,代码中的所有漏洞都将被填补。
const int size = numEntries;
int matrix[size];
class Cls1{
int nV; // <------------- nV is un-initialized
vector<bool> v1;
public:
Cls1 () {
v1 = vector<bool> (nV + 1, false); // <------------------ nV is used
}
};