Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;错误:在抛出';的实例后调用terminate;std::bad#u alloc';_C++ - Fatal编程技术网

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