Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 24

Программа вылетает с ошибкой std::bad_alloc

26.03.2016, 21:37. Показов 1507. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Задали написать программу, которая удаляет из файла все закомментированные строки(учитываются и //, и /* */) и реализовать в ней простой define вида #define a b(a и b - строки). Собственно, вот мой код. Но, проблема в том, что при запуске оно вылетает с ошибкой std::bad_alloc. я понимаю, что это исключение вылетает из-за ошибки выделения памяти. Но не могу понять, где именно она происходит. Умоляю, помогите, завтра сдача(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
 
int is_sl(vector <string> & res_file, string & s)
{
    if (s.find("//") != std::string::npos)
    {
        s.erase(s.begin() + s.find("//"), s.end());
        if (!(s.empty()))
            res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
int last_close_sl(string s)
{
    string r = s;
    reverse(r.begin(), r.end());
    return r.find("/*");
}
 
int is_open_mnsl(vector <string> & res_file, string & s, bool & flag)
{   
    if (s.find("/*") != std::string::npos)
    {
        if (s.find("*/") != std::string::npos)
        {
            if (last_close_sl(s) > s.find("/*"))
            {
                s.erase(s.begin() + s.find("/*"), s.begin() + s.find("*/") + 2);
                if (!(s.empty()))
                    res_file.push_back(s);
                return 1;
            }
            else
                return 0;
        }
        flag = 1;
        s.erase(s.begin() + s.find("/*"), s.end());
        if (!(s.empty()))
                res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
int is_close_mnsl(vector <string> & res_file, string & s, bool & flag){
    if ((flag) && s.find("*/") != std::string::npos){
        flag = 0;
        s.erase(s.begin(), s.begin() + s.find("*/") + 2);
        if (!(s.empty()))
            res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
vector <string>  DeleteComments()
{
    ifstream fin("1.txt");
    string s;
    vector <string> res_file;
    bool flag = 0;
    int cur_sum = 0;
    while (fin)
    {
        cur_sum = 0;
        getline(fin, s);
        cur_sum += is_close_mnsl(res_file, s, flag);
        if (!flag)
        {   
            if (s.find("//") != std::string::npos && s.find("/*") != std::string::npos)
            {
                if (s.find("//") < s.find("/*"))
                    cur_sum += is_sl(res_file, s);
                else
                    cur_sum += is_open_mnsl(res_file, s, flag);
            }
            else
            {
                cur_sum += is_sl(res_file, s);
                cur_sum += is_open_mnsl(res_file, s, flag);
            }
        }
        if (!flag && cur_sum == 0)
            res_file.push_back(s);
    }
    fin.close();
}
 
string get_str(string &s)
{
    s.erase(s.begin(), s.begin() + s.find(" ") + 1);
    string temp = s;
    temp.erase(temp.begin() + temp.find(" "), temp.end());
    return temp;
}
 
void Define(vector <string> res)
{
    string b;
    vector <pair <string, string> > define_list;
    int size = 0;
    int pos1 = 0;
    for (int i = 0; i < res.size(); ++i)
    {
        if (res[i].find("#define ") == 0)
        {
            b = res[i] + " ";
            define_list[size].first = get_str(b);
            define_list[size].second = get_str(b);
            size ++;
        }
        else
        {
            for (int j = 0; j < size; ++j)
                while (res[i].find(define_list[j].first) != std::string::npos)
                {
                    pos1 = res[i].find(define_list[j].first);
                    res[i].erase(res[i].begin() + pos1, res[i].begin() + pos1 + define_list[j].first.size() + 1);
                    res[i].insert(pos1, define_list[j].second);
                }
        }
    }
}
 
int main()
{
    vector <string> file = DeleteComments();
    Define(file);
    ofstream fout("res.txt");
    for (int i = 0; i < file.size(); ++i)
        fout << file[i] << endl;
    fout.close();
    return 0;   
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2016, 21:37
Ответы с готовыми решениями:

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc выделение памяти
Уважаемые форумчане! Работаю над программой обработки WAV файлов, но возникла такая проблема: при чтении файла возникает ошибка ...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Добрый день!Работаю с графами,и при больших значениях столкнулся с проблемой:ошибка в тесте программы на сайте такова: terminate called...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
При выполнении программы, которая миксует функции в которых создаются типовые задачи, вылезает ошибка, в чем проблема?? #include...

3
 Аватар для yrceus
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
26.03.2016, 21:56
На #define что-то сбивается. 112 строка.
Если #define с новой строки не вставлять, файл читается и переписывает.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.03.2016, 22:15
Лучший ответ Сообщение было отмечено knn как решение

Решение

Цитата Сообщение от knn Посмотреть сообщение
проблема в том, что
отсутствует файл:
Цитата Сообщение от knn Посмотреть сообщение
ifstream fin("1.txt");
и телепаты как бе в отпуске.

кроме того:
main.cpp(25): warning C4267: return: преобразование из "size_t" в "int"; возможна потеря данных
main.cpp(125): warning C4267: =: преобразование из "size_t" в "int"; возможна потеря данных
main.cpp(95): error C4716: DeleteComments: должна возвращать значение
после исправления ряда помарок,
исходный код приобрел вид:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
 
int is_sl(vector <string> & res_file, string & s)
{
    if (s.find("//") != std::string::npos)
    {
        s.erase(s.begin() + s.find("//"), s.end());
        if (!(s.empty()))
            res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
size_t last_close_sl(string s)
{
    reverse(s.begin(), s.end());
    return s.find("/*");
}
 
int is_open_mnsl(vector <string> & res_file, string & s, bool & flag)
{   
    if (s.find("/*") != std::string::npos)
    {
        if (s.find("*/") != std::string::npos)
        {
            if (last_close_sl(s) > s.find("/*"))
            {
                s.erase(s.begin() + s.find("/*"), s.begin() + s.find("*/") + 2);
                if (!(s.empty()))
                    res_file.push_back(s);
                return 1;
            }
            else
                return 0;
        }
        flag = 1;
        s.erase(s.begin() + s.find("/*"), s.end());
        if (!(s.empty()))
                res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
int is_close_mnsl(vector <string> & res_file, string & s, bool & flag){
    if ((flag) && s.find("*/") != std::string::npos){
        flag = 0;
        s.erase(s.begin(), s.begin() + s.find("*/") + 2);
        if (!(s.empty()))
            res_file.push_back(s);
        return 1;
    }
    return 0;
}
 
vector <string>  DeleteComments()
{
    string s;
    ifstream fin("1.txt");
    vector <string> res_file;
    int cur_sum = 0;
    bool flag = 0;
    
    while (fin)
    {
        cur_sum = 0;
        getline(fin, s);
        cur_sum += is_close_mnsl(res_file, s, flag);
        if (!flag)
        {   
            if (s.find("//") != std::string::npos && s.find("/*") != std::string::npos)
            {
                if (s.find("//") < s.find("/*"))
                    cur_sum += is_sl(res_file, s);
                else
                    cur_sum += is_open_mnsl(res_file, s, flag);
            }
            else
            {
                cur_sum += is_sl(res_file, s);
                cur_sum += is_open_mnsl(res_file, s, flag);
            }
        }
        if (!flag && cur_sum == 0)
            res_file.push_back(s);
    }
    return res_file;
}
 
string get_str(string &s)
{
    s.erase(s.begin(), s.begin() + s.find(" ") + 1);
    string temp = s;
    temp.erase(temp.begin() + temp.find(" "), temp.end());
    return temp;
}
 
void Define(vector <string> res)
{
    string b;
    vector <pair <string, string> > define_list;
    size_t size = 0;
    size_t pos1 = 0;
 
    for (size_t i = 0; i < res.size(); ++i)
    {
        if (res[i].find("#define ") == 0)
        {
            b = res[i] + " ";
            define_list[size].first  = get_str(b);
            define_list[size].second = get_str(b);
            ++size;
        }
        else
        {
            for (size_t j = 0; j < size; ++j)
                while (res[i].find(define_list[j].first) != std::string::npos)
                {
                    pos1 = res[i].find(define_list[j].first);
                    res[i].erase(res[i].begin() + pos1, res[i].begin() + pos1 + define_list[j].first.size() + 1);
                    res[i].insert(pos1, define_list[j].second);
                }
        }
    }
}
 
int main()
{
    vector <string> file = DeleteComments();
    Define(file);
    ofstream fout("res.txt");
    for (int i = 0; i < file.size(); ++i)
        fout << file[i] << endl;
    fout.close();
    return 0;   
}
я подсунул произвольный исходник в качестве 1.txt
и запустил.

диагностика: выход за пределы диапазона вектора.

C++
1
2
3
4
5
6
7
8
9
10
11
for (size_t i = 0; i < res.size(); ++i)
    {
        if (res[i].find("#define ") == 0)
        {
            b = res[i] + " ";
            define_list[size].first  = get_str(b);    //<----  define_list оказался пустым
                  // попытка взять нулевой элемент из пустого контейнера
 
            define_list[size].second = get_str(b);
            ++size;
        }

по хорошему здесь весь код заново переписать нужно.
Цитата Сообщение от knn Посмотреть сообщение
реализовать в ней простой define вида #define a b(a и b - строки).
хз, что тут имеется ввиду
1
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 24
26.03.2016, 23:20  [ТС]
Фух, до меня дошло! полгода писанины на чистом си заставили забыть плюсы.
Проблема решилась очень просто:
C++
1
pair <string, string> temp;
и вместо того бреда:
C++
1
2
3
temp.first =  get_str(b);
temp.second = get_str(b);
define_list.push_back(temp);
Всем спасибо! Тема закрыта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2016, 23:20
Помогаю со студенческими работами здесь

Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Есть задача: Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' при работе с типом std::string
Добрый вечер, при работе функции возникает ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): ...

Программа вылетает с ошибкой
начал читать Б. Страуструпа &quot;Программирование. Принципы и практика использования C++&quot; Пробую пример из текста и при запуске вылетает...

Программа вылетает с неизвестной ошибкой
Всем доброго времени суток. Имеется следующий простенький код для рисования круга. #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

Виртуальные функции. Программа вылетает с ошибкой.
Хотя дело может быть и не в виртуальных функциях. В общем портянка такова: #include &lt;iostream&gt; #include &lt;cstdlib&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru