Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
knn
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 24
#1

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

26.03.2016, 21:37. Просмотров 272. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2016, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа вылетает с ошибкой std::bad_alloc (C++):

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

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

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

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

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

Программа то вылетает с ошибкой, то работает корректно - C++
При запуске программа то вылетает с ошибкой, то работает нормально. Нутром чую, что проблема в следующем куске кода, где я создаю объекты...

3
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
26.03.2016, 21:56 #2
На #define что-то сбивается. 112 строка.
Если #define с новой строки не вставлять, файл читается и переписывает.
0
hoggy
6764 / 2949 / 507
Регистрация: 15.11.2014
Сообщений: 6,625
Завершенные тесты: 1
26.03.2016, 22:15 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
knn
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 24
26.03.2016, 23:20  [ТС] #4
Фух, до меня дошло! полгода писанины на чистом си заставили забыть плюсы.
Проблема решилась очень просто:
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
26.03.2016, 23:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2016, 23:20
Привет! Вот еще темы с ответами:

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

Удаление последнего элемента динамического массива (программа вылетает с ошибкой) - C++
for (vector&lt;P&gt;::iterator i = p.begin(); i != p.end(); ++i) { i -&gt; life --; if (i -&gt; life ==0) p.erase(i);...

std::bad_alloc - C++
Сразу оговорюсь, что пришёл в C++ из JavaScript, поэтому прошу сильно не бить. Суть в следующем: у нас есть 2 массива из bool (точнее 2...

Std::bad_alloc - C++
Возникает утечка. Пробовал очищать память в самых разный местах, но решить проблему не получается. for (int k = 0; k &lt; 22050; k++) { ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.