C++-fout: beëindigen aangeroepen na het genereren van een instantie van ‘std::bad_alloc’

Ik heb de onderstaande code geschreven om de volgende taken uit te voeren in de volgorde waarin ze zijn vermeld:

  1. Lees een invoerbestand en tel het aantal vermeldingen erin
  2. Maak een array met de juiste grootte (grootte gelijk aan het aantal items)
  3. Ga terug naar het begin van het invoerbestand en lees het opnieuw
  4. Bewaar de items in een array
  5. Druk het aantal vermeldingen in het bestand en de vermeldingen zelf af.

Hier is mijn 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;
}

Als ik het .cpp-bestand uitvoer, krijg ik steeds de foutmelding:

beëindigen aangeroepen na het gooien van een instantie van 'std::bad_alloc'
wat(): std::bad_alloc
Afgebroken (kern gedumpt)

Ik heb begrepen dat dit te maken heeft met een geheugentekort of variabelen die uit de main()-functie vallen, maar ik kan er niet achter komen hoe ik het probleem in deze specifieke situatie moet aanpakken. Als het relevant is, werk ik op een Linux-computer.


Antwoord 1, autoriteit 100%

Deze code heeft 3 gaten:


Eerste hole: int numEntries. Later doe je: ++numEntries;

U verhoogt niet-gespecificeerde waarde. Ik weet niet zeker of het UB is, maar nog steeds slecht.


Tweede en derde hole:

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

En

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

numEntries heeft een niet-gespecificeerde waarde (eerste hole). Je gebruikt het om length en size te initialiseren – dat is Undefined Behaviour. Maar laten we aannemen dat het slechts een groot aantal is – u wijst geheugen toe van een niet-gespecificeerde grootte (mogelijk gewoon een zeer grote grootte), vandaar de uitzondering std::bad_alloc – dit betekent dat u meer geheugen wilt toewijzen dat u hebt beschikbaar.

Bovendien is matrix VLA van niet-gespecificeerde grootte, wat zowel niet-standaard als niet-gedefinieerd gedrag is.


Antwoord 2, autoriteit 18%

Verlies van focus, 30 minuten verspild:

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

Zoals je kunt zien is nV niet geïnitialiseerd, maar wordt het hieronder in de constructor gebruikt.

Sinds de nV de vuilniswaarde aannam, verschillend voor elke run, werkte het programma soms, en andere keren crashte wanneer de nV-afvalwaarde erg hoog was (vuilniswaarde)

  • Rextester crashte niet, mogelijk door een andere initialisatie, https://rextester.com /l/cpp_online_compiler_gcc

  • Apache Netbeans geeft dit niet als waarschuwing weer

    • Als je bestanden onder Git hebt, kun je gemakkelijk wijzigingen zien, deze problemen vinden.

Hopelijk helpt dat.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes