Недостаточно памяти?

Я новичок в 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;
}

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

РЕДАКТИРОВАТЬ: извините, что я не ясно выразился, мой ввод представляет собой текстовый файл в формате csv. Я беру информацию и в первом столбце каждой строки ставлю 30 пробелов минус длина значения, а в остальных значениях ставлю 20 пробелов минус длина значения, если нет значения, в котором я поместите ноль с 19 пробелами.

Пример ввода:

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

person Mark Wilcoxen    schedule 08.09.2016    source источник
comment
if (j = 0) это явно неправильно. Возможно, вы имели в виду if (j == 0)   -  person Ari0nhh    schedule 08.09.2016
comment
Просто деталь безопасности, но я предлагаю объявить finalLine как const, чтобы вы были уверены, что он не расширяется где-то в цикле. (Насколько я вижу, это не так, но это скорее мера предосторожности, плюс это дает вам меньше поводов для беспокойства)   -  person Anže    schedule 08.09.2016
comment
Ваш первый курс действий должен состоять в том, чтобы запустить код в отладчике и определить, где в вашем коде возникает ошибка.   -  person kfsone    schedule 08.09.2016
comment
Никогда не выполняйте непроверенный ввод-вывод: вы должны убедиться, что вы find(',') делаете что-то разумное (в вашем случае оно должно быть меньше, чем j == 0 ? 30 : 20, иначе оно потеряет значение и выделит огромную строку в std::string(20 - line.find(',')) и т. д. Чтобы сделать ваш пример полным, вам нужно добавить пример ввода к вашей программе.   -  person BeyelerStudios    schedule 08.09.2016
comment
Откат последнего изменения, поскольку измененный код сделал существующий ответ недействительным.   -  person Cheers and hth. - Alf    schedule 08.09.2016


Ответы (3)


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

if (j = 0) {

к этому:

if (j == 0) {

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

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


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


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

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

не нужно иметь там j и выдавать предупреждение, напишите его так:

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

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

person gsamaras    schedule 08.09.2016
comment
Бесконечный цикл не переполняет стек. Бесконечная рекурсия работает. - person Ari0nhh; 08.09.2016
comment
Я изменил его, но он все еще выдает ошибку, но местоположение изменилось, поэтому я думаю, что это могло решить одну проблему. - person Mark Wilcoxen; 08.09.2016
comment
Я не думаю, что вы дали приведенный пример. Вы дали только одну строку @MarkWilcoxen, извините. - person gsamaras; 08.09.2016
comment
@gsamaras Все строки идентичны этой с таким же количеством значений и запятых, извините, если это было неясно - person Mark Wilcoxen; 08.09.2016
comment
Я не знаю, как выполнить этот @MarkWilcoxen, но тем не менее. Поскольку у вас уже есть несколько близких голосов и отрицательных голосов (не от меня, я был тем, кто проголосовал за, так как вы кажетесь новым), я бы выбрал один из ответов, уже опубликованных здесь, и принял его, если бы я был вами. Я бы снова прочитал все комментарии и ответы, улучшил свой код и опубликовал новый свежий вопрос с компилируемым минимальным примером и точным минимальным вводом, который воспроизвел бы ошибку. Ваше здоровье! :) - person gsamaras; 08.09.2016

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

Вставьте операторы печати для переменных цикла 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 во внутреннем цикле. Короче говоря, распечатывайте результаты каждой операции, и вам будет намного легче увидеть, что происходит.

person tetsuoii    schedule 08.09.2016

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

xyz                           c

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

Позиция первого заменяемого символа. Если это больше длины строки, выбрасывается out_of_range.

Я думаю, вы получили сейчас.

person Anil    schedule 08.09.2016