C ++错误:在抛出' std :: bad_alloc'

时间:2016-10-08 18:21:14

标签: c++

我编写了下面粘贴的代码,按照陈述的顺序执行以下任务:

  1. 读取输入文件并计算其中的条目数
  2. 创建适当大小的数组(大小等于条目数)
  3. 返回输入文件的开头并再次阅读
  4. 将条目存储在数组中
  5. 打印出文件中的条目数和条目本身。
  6. 这是我的代码:

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

    当我执行.cpp文件时,我不断收到错误消息:

    terminate called after throwing an instance of 'std::bad_alloc'
    what(): std::bad_alloc
    Aborted (core dumped)

    我已经收集到这与内存不足或变量从main()函数中掉出来了,但我无法弄清楚如何在这种特定情况下解决问题。如果它是相关的,我正在使用Linux计算机。

2 个答案:

答案 0 :(得分:4)

此代码有3个孔:

第一洞:int numEntries。稍后你会做:++numEntries;

您增加未指定的值。不确定它是不是UB,但仍然不好。

第二洞和第三洞:

const int length = numEntries;
int* arr = new int[length];

const int size = numEntries;
int matrix[size];

numEntries有未指定的值(第一洞)。您可以使用它来初始化lengthsize - 这是未定义的行为。但是我们假设它只是一个大数字 - 你分配未指定大小的内存(可能只是非常大的大小),因此std::bad_alloc异常 - 这意味着你想分配更多你可用的内存。

此外,matrix是未指定大小的VLA,这是非标准和未定义的行为。

答案 1 :(得分:0)

对我来说,失去焦点1秒,花费了30分钟的调试时间:

class Cls1{
    int nV;   //  <------------- nV is un-initialized
    vector<bool> v1;
public:
    Cls1 () {
        v1 = vector<bool> (nV + 1, false);  // <------------------ nV is used
    }
};

如您所见,nV尚未初始化,但在构造函数中已在下面使用。
由于nV的垃圾值每次运行都不同,因此该程序有时会工作,并且当nV垃圾值非常高时有时会崩溃。

我不想在编写的程序中使用v1,但在以后的程序中使用v1,所以我什至没有研究它。

临时地,直到我解决了这个问题,我才转到一个在线编译器,由于没有进行初始化,https://rextester.com/l/cpp_online_compiler_gcc

并没有崩溃。

第二天,我查看了该程序,它是构造函数的第一行,一个未使用的变量,导致了该问题,不确定Apache Netbeans为什么不将其显示为警告。

如果您使用的是源代码控制,并且频繁提交,则很容易找到它。

希望有帮助。