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

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

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

Ошибка "Bad allocation" при обращении к массиву - C++

19.05.2016, 03:42. Просмотров 608. Ответов 3
Метки нет (Все метки)

Такая проблема: выбивает bad allocation в 59 строке мейна.
Запустите программу, введите 2 числа и выберите "Сложение", введите "0 1".
Пишут, что эта ошибка связана с оператором new, но в классе Hex вообще не используются динамические переменные.

"Main.cpp"
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include "Hex.h"
#include "Mass.h"
using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::getline;
 
void Out(Mass<Hex> &mass) {
    for (int i = 0; i < mass.getIndex(); i++) {
        cout << i << ". " << mass.getElement(i).getNumber() << endl;
    }
}
int main() {
    setlocale(LC_ALL,"rus");
    string str;
    Hex hex;
    Mass<Hex> mass(1);
    do {
        cout << "Введите шестнадцатиричное число: ";
        getline(cin, str);
        try {
            hex.setNumber(str);
            mass.Add(hex);
        }
        catch (std::exception &e) { cout << "Неверный формат ввода!" << endl; }
        cout << "Прекратить ввод? (Y|N)\n";
        int Choose;
        do {
            Choose = _getch();
        } while (Choose != 121 && Choose != 110);
        if (Choose == 121)
            break;
    } while (true);
 
    do {
        system("cls");
        Out(mass);
        int Choose = 49;
        cout << "Выберите операцию:\n(1)Сложение\n(2)Разница\n(3)Умножение\n(4)Деление\n(5)Перевод в десятичную с.ч.\n(6)Перевод двоичного числа в шестнадцатиричное\n";
        do {
            Choose = _getch();
        } while (Choose < 49 || Choose > 54);
        switch (Choose) {
        case 49: {
            cout << "Введите индексы чисел для сложения (через пробел)" << endl;
            int i, j;
            cin >> i >> j;
            try {
                if (i < 0 || i > mass.getIndex())
                    throw new std::exception("Вы выходите за пределы массива!");
                if (j < 0 || j > mass.getIndex())
                    throw new std::exception("Вы выходите за пределы массива!");
 
                cout << "1" << endl;
                cout << mass.getElement(i).Add(mass[j].getNumber()) << endl;
            }
            catch (std::exception &e) {
                cout << e.what() << endl;
            }
        }break;
        case 50: {
            cout << "Введите индексы чисел для разницы (через пробел)" << endl;
            int i, j;
            cin >> i >> j;
            try {
                if (i < 0 || i > mass.Length())
                    throw new std::exception("Вы выходите за пределы массива!");
                if (j < 0 || j > mass.Length())
                    throw new std::exception("Вы выходите за пределы массива!");
                cout << mass[i].Sub(mass[j].getNumber()) << endl;
            }
            catch (std::exception &e) {
                cout << e.what() << endl;
            }
        }break;
        case 51: {
            cout << "Введите индексы чисел для умножения (через пробел)" << endl;
            int i, j;
            cin >> i >> j;
            try {
                cout << mass[i].Mul(mass[j].getNumber()) << endl;
            }
            catch (std::exception &e) {
                cout << "Вы выходите за пределы массива!" << endl;
            }
        }break;
        case 52: {
            cout << "Введите индексы чисел для деления (через пробел)" << endl;
            int i, j;
            cin >> i >> j;
            try {
                cout << mass[i].Div(mass[j].getNumber()) << endl;
            }
            catch (std::exception &e) {
                cout << "Вы выходите за пределы массива!" << endl;
            }
        }break;
        case 53: {
            cout << "Введите индекс числа для перевода" << endl;
            int i;
            cin >> i;
            try {
                cout << mass[i].Hex_to_Dec(mass[i].getNumber()) << endl;
            }
            catch (std::exception &e) {
                cout << "Вы выходите за пределы массива!" << endl;
            }
        }break;
        case 54: {
            cout << "Введите двоичное число" << endl;
            string i;
            getline(cin, i);
            try {
                cout << mass[0].Double_to_Hex(i) << endl;
            }
            catch (std::exception &e) {
                cout << "Неверный формат ввода!" << endl;
            }
        }break;
        }
        cout << "Закончить программу?(Y|N)";
    } while (_getch() != 121);
    return 0;
}


"Mass.h"
Кликните здесь для просмотра всего текста

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
#pragma once
#include <exception>
template <class T>
class Mass {
private:
    T* mas;
    int index = 0;
    int n = 0;
 
    void MoreLength() {
        T* _mas = new T[n];
        int _n = n;
        n = n * 1.5 + 2;
        for (int i = 0; i < _n; i++)
            _mas[i] = mas[i];
        delete[] mas;
        mas = new T[n];
        for (int i = 0; i < _n; i++) {
            mas[i] = _mas[i];
        }
        delete[] _mas;
    }
public:
    Mass() {
        n = 10;
        mas = new T[10];
    }
    Mass(int _n) : n(_n) {
        mas = new T[_n];
    }
    Mass(const Mass &_mas) {
        delete[] mas;
        n = _mas.n;
        mas = new T[n];
        for (int i = 0; i < _n; i++) {
            mas[i] = _mas.mas[i];
        }
        index = 0;
    }
    ~Mass() { delete[] mas; }
 
    int Length() { return n; }
    T getElement(int _index) {
        if (_index < n && _index >= 0)
            return mas[_index];
        else throw new std::exception;
    }
    void setElement(T value, int _index) {
        while (true) {
            if (_index >= n)
                MoreLength();
            else break;
        }
        if (_index >= 0)
            mas[_index] = value;
        else throw new std::exception;
    }
    T* getMass() { return mas; }
    T &operator[](int i) { return getElement(i); }
    void Add(T obj) {
        setElement(obj, index);
        index++;
    }
    int getIndex() { return index; }
};


"Hex.h"
Кликните здесь для просмотра всего текста

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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <string>
#include <exception>
#include <cmath>
#include <iostream>
using namespace std;
#pragma once
class Hex {
private:
    std::string number;
    bool isHex() {
        for (int i = 0; i < number.length(); i++)
        {
            switch (number[i]) {
            case '0': case '1': case '2':case '3':case '4':case '5':case '6':
            case '7':case '8':case '9':case 'A':case 'B':case 'C':case 'D':
            case 'E':case 'F':break;
            default: return false;
            }
        }
        return true;
    }
    bool isDouble(std::string double_number) {
        for (int i = 0; i < double_number.length(); i++)
            if (double_number[i] != '0' && double_number[i] != '1')
                return false;
        return true;
    }
public:
    Hex() { number = "0"; }
    Hex(std::string _number): number(_number){}
    ~Hex() {}
    Hex(const Hex &_number) {
        number = _number.number;
    }
    int Hex_to_Dec(std::string _number)
    {
        int k;
        int dec_number = 0;
        for (int i = 0; i < _number.length(); i++) {
            switch (_number[i]) {
            case 'A': k = 10; break;
            case 'B': k = 11; break;
            case 'C': k = 12; break;
            case 'D': k = 13; break;
            case 'E': k = 14; break;
            case 'F': k = 15; break;
            case '1': k = 1; break;
            case '2': k = 2; break;
            case '3': k = 3; break;
            case '4': k = 4; break;
            case '5': k = 5; break;
            case '6': k = 6; break;
            case '7': k = 7; break;
            case '8': k = 8; break;
            case '9': k = 9; break;
            case '0': k = 0; break;
            }
            dec_number += k*pow((double)16, (double)_number.length() - i - 1);
        }
        return dec_number;
    }
    std::string Hex_to_Double() {
        std::string k;
        std::string double_number = "";
        for (int i = 0; i < number.length(); i++) {
            switch (number[i]) {
            case 'A': k = "1010"; break;
            case 'B': k = "1011"; break;
            case 'C': k = "1100"; break;
            case 'D': k = "1101"; break;
            case 'E': k = "1110"; break;
            case 'F': k = "1111"; break;
            case '1': k = "0001"; break;
            case '2': k = "0010"; break;
            case '3': k = "0011"; break;
            case '4': k = "0100"; break;
            case '5': k = "0101"; break;
            case '6': k = "0110"; break;
            case '7': k = "0111"; break;
            case '8': k = "1000"; break;
            case '9': k = "1001"; break;
            case '0': k = "0000"; break;
            }
            double_number += k;
        }
        return double_number;
    }
    int Double_to_Dec(std::string double_number) {
        if (isDouble(double_number))
            throw new std::exception;
 
        int dec_number = 0;
        for (int i = 0; i >= double_number.length(); i++) {
            if (double_number[i] == '1')
                dec_number += pow(2, double_number.length() - 1 - i);
        }
        return dec_number;
    }
    std::string Dec_to_Hex(int dec_number) {
        std::string hex_number = "";
        std::string ch = "";
        if (dec_number < 0)
            ch = "-";
        dec_number = abs(dec_number);
        while (true) {
            double d = dec_number / 16;
            if (d < 1) {
                break;
            }
            switch (dec_number % 16) {
            case 15: hex_number += "F"; break;
            case 14: hex_number += "E"; break;
            case 13: hex_number += "D"; break;
            case 12: hex_number += "C"; break;
            case 11: hex_number += "B"; break;
            case 10: hex_number += "A"; break;
            default: {
                char temp[1];
                _itoa_s(dec_number % 16,temp,10);
                hex_number += temp;
            }
            }
            dec_number = dec_number / 16;
        }
        char temp[1];
        _itoa_s(dec_number % 16, temp, 10);
        hex_number += temp;
        hex_number += ch;
        std::string true_hex = "";
        for (int i = 0; i < hex_number.length(); i++) {
            true_hex += hex_number[hex_number.length() - 1 - i];
        }
        return true_hex;
    }
    std::string Double_to_Hex(std::string double_number) {
        int dec_number = Double_to_Dec(double_number);
        return Dec_to_Hex(dec_number);
    }
 
    void setNumber(std::string _number) {
        if (isHex())
            number = _number;
        else throw new std::exception;
    }
    std::string getNumber() { return number; }
    std::string Add(std::string _number) {
        int first = Hex_to_Dec(number),
            second = Hex_to_Dec(_number);
        return Dec_to_Hex(first + second);
    }
    std::string Sub(std::string _number) {
        int first = Hex_to_Dec(number),
            second = Hex_to_Dec(_number);
        return Dec_to_Hex(first - second);
    }
    std::string Mul(std::string _number) {
        int first = Hex_to_Dec(number),
            second = Hex_to_Dec(_number);
        return Dec_to_Hex(first * second);
    }
    std::string Div(std::string _number) {
        int first = Hex_to_Dec(number),
            second = Hex_to_Dec(_number);
        return Dec_to_Hex(first / second);
    }
    bool operator>(Hex &n) {
        if (Hex_to_Dec(number) > Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    bool operator>=(Hex &n) {
        if (Hex_to_Dec(number) >= Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    bool operator<(Hex &n) {
        if (Hex_to_Dec(number) < Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    bool operator<=(Hex &n) {
        if (Hex_to_Dec(number) <= Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    bool operator==(Hex &n) {
        if (Hex_to_Dec(number) == Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    bool operator!=(Hex &n) {
        if (Hex_to_Dec(number) != Hex_to_Dec(n.getNumber()))
            return true;
        return false;
    }
    Hex& operator=(Hex &n) {
        number = n.getNumber();
        return *this;
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2016, 03:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "Bad allocation" при обращении к массиву (C++):

При повторном "обращении" к заранее созданному массиву последний элемент отображается неверно - C++
собственно заполняем массив int рандомом через функцию (ну в задании указано - заполнить через функцию, поэтому и такой ход). Потом из...

Считывание чисел из файла в массив и ошибка: "Invalid allocation size: 4294967295 byte" - C++
Всем привет. Есть два вопроса. 1. Нужно считать из txt файла числа в массив столбцов и строк. Код вроде правильный, но пишет...

Код при компиляции пишет ошибку: "Invalid allocation size: 4294967295 byte" - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;stdio.h&gt; using namespace std; struct list{ int d; list *next;}; int...

Ошибка Необработанное исключение в "0x001d18f8" в "lr7v2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde9" - C++
class Hdd { public: char Hdd_name; int total_space; int free_space; int speed; Hdd *next; Hdd *previous; };

Ошибка при сборке многофайлового проекта: "невозможно преобразовать "int" в "const golf" - C++
Сделал многофайловую программу программу, вот она: //golf.h #include &lt;iostream&gt; #ifndef golg_h_ #define golf_h_ const int Len =...

Где ошибка невозможно преобразовать указатель "this" из "const pers" в "pers &" при выводе объектов через cout - C++
Добрый день! Переписал код из книг Лафоре, создание мультимножества из собственных объектов- справочник телефонный, с именем и фамилией. ...

3
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
19.05.2016, 11:39 #2
Цитата Сообщение от Illko Посмотреть сообщение
Пишут, что эта ошибка связана с оператором new, но в классе Hex вообще не используются динамические переменные.
Так у вас сколько всего помимо.
0
AlexVRud
459 / 170 / 44
Регистрация: 04.07.2014
Сообщений: 475
19.05.2016, 12:20 #3
Цитата Сообщение от Illko Посмотреть сообщение
C++
1
2
3
4
int Length() { return n; }
   T getElement(int _index);
//...
   T &operator[](int i) { return getElement(i); }
Как это вообще компилировалось у тебя, ты пытаешься вернуть по ссылке локальную копию объекта.
0
Illko
1 / 1 / 0
Регистрация: 25.05.2015
Сообщений: 32
19.05.2016, 17:54  [ТС] #4
Поменял, спасибо

Добавлено через 2 часа 6 минут
Проблема решена. Я как-то не правильно пользовался функцией _itoa_s(). Поэтому решил обойтись без нее
0
19.05.2016, 17:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2016, 17:54
Привет! Вот еще темы с ответами:

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union - C++
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of &quot;.real&quot;,&quot;.imag&quot; must have struct/class/union... Почему возникает эта...

Возникает ошибка "0xC0000005: Нарушение прав доступа при чтении "0xfeeefee2"." - C++
Подскажите, пожалуйста, в чем может быть ошибка и как его исправить? В деструкторе указывает на ошибку. #pragma once class...

Ошибка "*.exe вызвал срабатывание точки останова" и "HEAP CORRUPTION" при вызове деструктора программой - C++
Здравствуйте! Сделал простенькое упражнение на указатели, но программа выдает названные ошибки. При первом после последнего сохранения...

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка - C++
#include &lt;iostream&gt; #include&lt;ctime&gt; #include&lt;stdio.h&gt; #include&lt;locale.h&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; ...


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

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

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