Ошибка C ++: прекращение вызова после выброса экземпляра ‘std :: bad_alloc’

Я написал приведенный ниже код для выполнения следующих задач в том порядке, в котором они указаны:

  1. Прочитать входной файл и посчитать количество записей в нем
  2. Создать массив соответствующего размера (размер, равный количеству записей)
  3. Вернитесь к началу входного файла и прочитайте его снова.
  4. Храните записи в массиве
  5. Распечатайте количество записей в файле и сами записи.

Вот мой код:

#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, я получаю сообщение об ошибке:

прекращение вызова после выброса экземпляра 'std :: bad_alloc'
что (): std :: bad_alloc
Прервано (ядро сброшено)

Я понял, что это связано с нехваткой памяти или выпадением переменных из функции main (), но я не могу понять, как решить проблему в этой конкретной ситуации. Если это актуально, я работаю на компьютере с Linux.

4

Решение

Этот код имеет 3 отверстия:


Первое отверстие: int numEntries, Позже вы делаете: ++numEntries;

Вы увеличиваете неопределенное значение. Не уверен, что это UB, но все равно плохо.


Второе и третье отверстие:

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

А также

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

numEntries имеет неопределенное значение (первое отверстие). Вы используете его для инициализации length а также size — это неопределенное поведение. Но давайте предположим, что это просто какое-то большое число — вы выделяете память неопределенного размера (возможно, просто очень большого размера), следовательно, std::bad_alloc исключение — это означает, что вы хотите выделить больше доступной памяти.

Также, matrix является VLA неопределенного размера, который является как нестандартным, так и неопределенным поведением.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector