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

Ошибка std::bad_alloc

30.04.2015, 18:17. Показов 3223. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Уже который день борюсь с этой ошибкой, но не могу понять, в чем проблема. После возникновения ошибки ругается на динамический массив new.
Суть в том, что я забиваю этот массив точками, но при запуске программы, буквально через пару секунд нормальной работы, она вылетает!
Во время отладки, когда ставлю паузу на glEnd и проверяю каждый цикл - все в порядке и точки адекватные выходят в point1, point2 и так далее. Но стоит убрать паузу и запустить - пару секунд работы и ошибка std::bad_alloc с ссылкой на poly=new Poly[inN];
При надобности могут скинуть полный исходный код, просто сюда он явно не поместится. Очень надеюсь на вашу помощь

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
struct Point
 
{
 
float x;
 
float y;
 
float z;
 
int s;
 
};
 
 
struct Poly
{
 
   Point point1, point2, point3;
   Point Normal;
 
};
 
class surface
        {
 int N;
 
   public:
           Poly *poly;   
                surface(int inN)   
                {
                    N=inN;
                    poly=new Poly[inN]; //ругается на эту строчку
 
 
                }
 
         };
А здесь идет сама обработка:
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
int Draw (GLvoid)
{
 
int x, y;
int i, j;
float Point1[3],Point2[3],Point3[3];
float Normal[3];
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 
    glLoadIdentity();                                               
    glTranslatef(400.0f,300.0f,-200.0f);
 
        glRotatef(xrot,1.0f,0.0f,0.0f);     // Rotate on The X axis
    glRotatef(yrot,0.0f,1.0f,0.0f);     // Rotate on The Y axis
    glRotatef(90,0.0f,0.0f,1.0f);       // Rotate on The Z axis                         
 
                                                    
    glMultMatrixf(Transform.M);                                     
    
glBegin(GL_TRIANGLES);
  surface surf1(480*640); //здесь задается массив, куда должна будет записаться фигура(точки)
                
        for( x = 0; x < 480; x++ )              
        {
            for( y = 0; y < 640; y++ )          
            {
 
 
                      glColor3f(1.0f,0.75f,0.75f);
 
                        if(S[x][y]==0)
 
                       glColor3f(0.3f,0.3f,0.75f);
 
                       Point1[0] =  x-240;
                        Point1[1] =  y-320;
                         Point1[2] = points[x][y];
surf1.poly[x*640+y].point1.x=Point1[0];
                       Point2[0] =  x-240+1;
                        Point2[1] =  y-320;
                         Point2[2] = points[x+1][y];
                 // surf1.poly[x*640+y].point2.y=Point2[0];
                       Point3[0] =  x-240;
                        Point3[1] =  y+1-320;
                         Point3[2] = points[x][y+1];
                       WorkOutNormal(Point1,Point2,Point3,Normal);
                      glNormal3fv(Normal);
                         if ((points[x][y]>-20)&&(points[x+1][y]>-20)&&(points[x][y+1]>-20)&&(points[x+1][y+1]>-20))
                  {
 
                         glNormal3fv(Normal);
        
                    glVertex3f( x-240, y-320, points[x][y] );
                            glVertex3f( x+1-240, y-320, points[x+1][y] );
                            glVertex3f( x-240, y+1-320, points[x][y+1] );
 
 
             
                 glNormal3fv(Normal);
            
                            glVertex3f( x+1-240, y-320, points[x+1][y] );
                            glVertex3f( x-240, y+1-320, points[x][y+1] );
 
 
              glVertex3f( x+1-240, y+1-320, points[x+1][y+1] );
             }
 
        }
        }
 
 
 
 
    glEnd();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2015, 18:17
Ответы с готовыми решениями:

Ошибка 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...

15
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.04.2015, 19:02
Есть как минимум 2 идеи:
1. Либо в surface(int inN) передается слишком большое (или отрицательное) число.
2. Либо из-за отсутствия деструктора surface (т.е. нет освобождения памяти), память тупо заканчивается в очередной прекрасный момент.
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 8
30.04.2015, 19:06  [ТС]
В surface(int inN) как раз передается число вот это: surface surf1(480*640);
Дело в том, что память не должна заканчиваться, потому что выделено именно столько, сколько точек в массиве! Даже если, к примеру, я ставлю число 10000000000 - результат тот же!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.04.2015, 19:14
symbot, сколько раз вызывается конструктор surface? Скорее всего далеко не 1 раз. Память выделяется динамически вручную. Стало быть надо в деструкторе ее освобождать.
Я не знаю, может ты его просто не привел, а он у тебя на самом деле есть. Но если его нет, то он должен быть таким:
C++
1
2
3
~surface() {
   delete [] poly; 
}
Добавь его и посмотри как поведет себя программа.
Дополнительно могу предложить посмотреть в диспетчере задач сколько памяти скушает твой процесс до момента падения.
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.04.2015, 19:22
Цитата Сообщение от symbot Посмотреть сообщение
surf1.poly[x*640+y].point1.x=Point1[0];
Тут выхода нет за границу массива?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
30.04.2015, 19:23
куча говнокода.
хранится какой-то сырой указатель на массив poly. Зачем? Вектора что ли отменили?
идём дальше. Ни конструктора копий, ни деструктора, ни оператора присваивания... память течёт!
ну хрен с этим, вроде лишь один объект surface создаётся, пока говнокод можно стерпеть... но что творится в цикле?
points[x+1][y+1] - что это такое? Я не вижу нигде объявления этой переменной. Это точно массив размером 641 на 481 или всё-таки меньше и происходит выход за его границы?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.04.2015, 19:23
Цитата Сообщение от lss Посмотреть сообщение
Тут выхода нет за границу массива?
Нет. Видно из строк 22-26.
1
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 8
30.04.2015, 19:26  [ТС]
Конструктор surface как раз вызывается один раз, в том коде, что я скинул, больше он нигде не вызывается!
Деструктор, который вы написали, помог, ошибки нет, но и при этом при отладке в
C++
1
surf1.poly[x*640+y].point1.x=Point1[0];
не показываются точки, которые там должны быть, все только со знаком ????. А эта строка как раз необходима для того, чтобы отображать сохраненные в массиве точки

Добавлено через 1 минуту
to Kuzia domovenok
Задается это глобальной переменной float points[ 480 ][ 640 ]; Здесь ее, конечно, не видно
0
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
30.04.2015, 19:29
Цитата Сообщение от symbot Посмотреть сообщение
Конструктор surface как раз вызывается один раз
Деструктор все равно должен быть. В конструкторе выделяется память, а кто освобождать будет?
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 8
30.04.2015, 19:34  [ТС]
Цитата Сообщение от f1ff Посмотреть сообщение
Деструктор все равно должен быть. В конструкторе выделяется память, а кто освобождать будет?
Дело еще в том, что это пока что он один раз вызывается, по идее всего вызова должно быть 4. То есть тут уж тем более деструктор нужен?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.04.2015, 19:36
Цитата Сообщение от symbot Посмотреть сообщение
float points[ 480 ][ 640 ]
Тогда выходы за границу присутствуют(там где индексы x + 1, y + 1)/
1
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 8
30.04.2015, 19:40  [ТС]
Кстати, при этой ошибке, X и Y становятся размеров больше, чем прописаны, а именно x=1638224 и y=1064621348

Даже если я размер меняю на 479*639 - изменений ноль
0
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
30.04.2015, 19:41
Цитата Сообщение от symbot Посмотреть сообщение
о есть тут уж тем более деструктор нужен?
Не только деструктор, но еще как минимум конструктор копии и оператор присваивания как написал Kuzia domovenok.

Так же можете эту строчку poly=new Poly[inN]; завернуть в блок try {} catch{} для отлова ошибки std::bad_alloc
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 8
30.04.2015, 19:48  [ТС]
Спасибо за подсказки, буду копать дальше!
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.04.2015, 19:49
Цитата Сообщение от symbot Посмотреть сообщение
Даже если я размер меняю на 479*639 - изменений ноль
Когда ошибки, возможно, в нескольких местах, то так и будет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
01.05.2015, 09:34
Цитата Сообщение от f1ff Посмотреть сообщение
Не только деструктор, но еще как минимум конструктор копии и оператор присваивания
Отнюдь не обязательно. Если объект не предполагает копирование, то ни копирующий конструктор, ни оператор копирующего присваивания не нужны. Хотя в таком случае всё же стоит объявить (без определения) их в приватной секции (или как delete, если поддерживается C++11).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.05.2015, 09:34
Помогаю со студенческими работами здесь

Ошибка 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(): ...

Ошибка std::bad_alloc
Добрый день, возникает ошибка std::bad_alloc когда вызывается функция void new_error(string error_text) у класса который ниже //Класс...

Ошибка std::bad_alloc
Помогите. Если запускать программу с number = 6, то всё работает, а вот если запустить программу, поменяв 6 на любое другое число, то...

Ошибка: terminate called after throwing an instance of 'std::bad_alloc'
Доброго времени суток В сурсе #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;array&gt; #include...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
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