Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
knn
0 / 0 / 0
Регистрация: 26.03.2016
Сообщений: 24
1

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

26.03.2016, 21:37. Просмотров 822. Ответов 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
Ответы с готовыми решениями:

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

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

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

3
yrceus
82 / 82 / 80
Регистрация: 25.08.2013
Сообщений: 330
26.03.2016, 21:56 2
На #define что-то сбивается. 112 строка.
Если #define с новой строки не вставлять, файл читается и переписывает.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
26.03.2016, 22:15 3
Лучший ответ Сообщение было отмечено 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
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2016, 23:20

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

Программа то вылетает с ошибкой, то работает корректно
При запуске программа то вылетает с ошибкой, то работает нормально. Нутром чую, что проблема в...

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


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

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

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