2016-09-08 7 views
0

Я новичок в C++ и Microsoft Visual Studio, и сейчас я работаю над лабораторией для своего класса структур данных, я закончил свой код, но когда я создаю и запускаю свою программу, он выдает эту ошибку:Недостаточно памяти?

std::bad_alloc at memory location 0x0018C9C0. 

Я искал эту ошибку, и обнаружил, что эта ошибка возникает, если для программы недостаточно памяти, или программа пытается выделить бесконечное количество памяти для чего-то. Я попытался выделить больше памяти в свойствах программы, но это, похоже, не помогло. Оглядываясь на мой код, я не могу найти ничего, что могло бы вызвать эту ошибку. Вот мой код для справки:

#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    string value; 
    string linesArray[200]; 
    int i = 0; 
    int j = 0; 
    int finalLine = 158; 

    getline(cin, line, '\n'); 
    getline(cin, line, '\n'); 

    /* First Line */ 
    for (i; i < finalLine; ++i) { 
     getline(cin, line, '\n'); 

     for (j; j <= 24; ++j) { 
      if (j = 0) { 
       line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
      } 
      line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     } 
     linesArray[i] = value; 
     cout << linesArray[i] << endl; 
    } 

    return 0; 
} 

Я попытался создать указатель, чтобы найти адрес, который он показывает в ошибки, но я не мог найти его. Любая помощь приветствуется.

EDIT: Извините, что я не дал мне понять, мой входной файл является txt в формате csv. Я беру информацию, а в первом столбце каждой строки я помещаю 30 пробелов минус длина значения, а для остальных значений - 20 пробелов минус длина значения, если нет значения, в котором я поместите ноль с 19 пробелами.

Пример входных данных:

Albania,14,29365,43301,,,,,,,13,27867,41066,,,,,,,1,1498,2235,,, 
+6

'if (j = 0)' это явно неправильно. Возможно, вы имеете в виду 'if (j == 0)' – Ari0nhh

+1

Просто деталь безопасности, но я предлагаю объявить finalLine как const, поэтому вы уверены, что он не расширяется где-то в цикле. (Насколько я вижу, это не так, но это скорее мера предосторожности, плюс это дает вам еще одну возможность беспокоиться) –

+0

Ваш первый курс действий должен состоять в том, чтобы запустить ваш код в отладчике и определить, где в вашем коде возникает ошибка. – kfsone

ответ

2

Изменение этого:

if (j = 0) { 

к этому:

if (j == 0) { 

для начала. И попробуйте еще раз ...

Я не подозреваю, что ваш код выделяет столько памяти, чтобы выбросить исключение std::bad_alloc.


Когда вы j = 0каждый раз, когда на звезду вашей *, вы создаете бесконечный цикл ...


Обратите внимание, что после коррекции, что я получаю два предупреждения expression result unused, при компиляции с флагом -Wall, которые не являются причиной проблемы, но было бы неплохо понять, что:

for (j; j <= 24; ++j) { 

не нужно иметь j там и производить предупреждение, написать это:

for (; j <= 24; ++j) { 

, так как вы не хотите инициализировать j там.

+1

Бесконечный цикл не переполняет стек. Infinite * recursion * делает. – Ari0nhh

+0

Correct @ Ari0nhh, обновлено! – gsamaras

+0

Я изменил его, но он по-прежнему выдает ошибку, но местоположение изменилось, поэтому я думаю, что, возможно, это помогло одна проблема. –

1

рассмотрит значение для line="xyz,abc", в соответствии с вашим кодом, для j==0, код работает и и line будет иметь значение обновления, в котором ',' заменяется, следующее из положить на 'line' после первого replace,

xyz       c 

сейчас, во второй итерации, заменяя переменную line, вы отыскания ',' т.е. line.find(','), который не присутствует в line строке и std::find()' вернется std::string::npos, это где вы должны обрабатывать исключения, следующий URL говорит, что string::replace, вы можете обнаружить, что для параметра pos

Position of the first character to be replaced. If this is greater than the string length, it throws out_of_range.

я думаю, что вы получили в настоящее время.

1

Первые две линии getlines не имеют смысла, они получают перезаписью getline в цикле i. Строка значения никогда не получает никакого значения. Затем вы берете какой-то ввод, который, как представляется, должен иметь особый формат - потому что замена строки не делает ничего значимого для любой строки, которую я мог бы написать. Если мы хотим понять, что вы пытаетесь сделать, нам нужно знать формат ваших входных строк.

Вставьте операторы печати для обеих ваших переменных цикла я и J и строка строка после любой операции, например:

/* First Line */ 
for (i; i < finalLine; ++i) { 
    getline(cin, line, '\n'); 
    line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
    cout << "[i=" << i << "] " << line << endl; 
    for (j; j <= 24; ++j) { 
     line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     cout << "[j=" << j << "] " << line << endl; 
    } 
    linesArray[i] = line; 
    cout << linesArray[i] << endl; 
} 

Кроме того, я переместил первая линия заменить из J петля.

Когда я запустил код, сначала замените произведенную тарабарщину, которая может иметь большее значение для ваших специально форматированных строк. Затем он разбился на первый j = 0 заменить во внутреннем цикле. Короче говоря, напечатайте результаты каждой операции, и вам будет намного легче увидеть, что происходит.