I wrote the code pasted below to perform the following tasks in the order in which they are stated:
- Read an input file and count the number of entries in it
- Create an array of appropriate size (size equal to number of entries)
- Go back to the beginning of the input file and read it again
- Store the entries in an array
- Print out the number of entries in the file and the entries themselves.
Here is my code:
#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;
}
When I execute the .cpp file I keep getting the error message:
terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)
I have gathered this has to do with a memory shortage or variables falling out of the main() function, but I can not figure out how to address the problem in this specific situation. If it is relevant, I am working on a Linux computer.
Loss of focus, wasted 30 mins:
As you can see nV is un-initialized, but is used below in constructor.
Since the nV took garbage value, different for each run, the program sometimes worked, and other times crashed when the nV garbage value is very high (garbage value)
Rextester didn't crash, possibly due to some different initialization, https://rextester.com/l/cpp_online_compiler_gcc
Apache Netbeans does not show this as warning
Hope that helps.
This code has 3 holes:
First hole:
int numEntries
. Later you do:++numEntries;
You increment unspecified value. Not sure if it's UB, but still bad.
Second and third hole:
And
numEntries
has unspecified value (first hole). You use it to initializelength
andsize
- that is Undefined Behaviour. But let's assume it is just some big number - you allocate memory of unspecified size (possibly just very big size), hence thestd::bad_alloc
exception - it means you want to allocate more memory that you have available.Also,
matrix
isVLA
of unspecified size, which is both non-standard and Undefined behaviour.