Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49

Существует ли ограничение при использовании new?

21.04.2013, 21:31. Показов 1283. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Ситуация: Я создала класс, описание которого ниже, и хочу выделить память под массив экземпляров этого класса размерностью 28000.
Проблема в следующем:Во время выполнения программы, в момент выделения памяти вылетает ошибка:

Необработанное исключение в "0x74a34b32" в "SPH_var2.exe": Исключение Microsoft C++: std::bad_alloc по адресу 0x00c3f2c4..

В чем может быть проблема? Есть ли ограничение? И как его можно обойти?

з.ы. Если размерность меньше 17-18 тысяч, все ок, работает отлично, т.е. по идее в коде ошибки не должно быть.
Да, и память освобождаю, деструктор есть.

Буду рада любой помощи, спасибо!

Описание класса

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
class particle{
public:
    double x;       //значение координаты x
    double last_x;  //значение х на прошлом шаге для интегрирования рунге-кутты
    double y;       //значение координаты y
    double last_y;  //значение у на прошлом шаге для интегрирования рунге-кутты
    double p;       //значение давления
    double rho;     //значение плотности
    double e;       //значение энергии
    double last_e;  //значение энергии на прошлом шаге для интегрирования рунге-кутты
    double ux;      //значение скорости по х
    double last_ux; //значение скорости по х на прошлом шаге для интегрирования рунге-кутты
    double uy;      //значение скорости по у
    double last_uy; //значение скорости по у на прошлом шаге для интегрирования рунге-кутты
    double m;       //значение массы частицы
    int count_N;    //количество соседок частицы
    int *arr_N;     //массив индексов соседних частиц
    double sum_ux;  //значение суммирования правой части уравнения для ux
    double sum_uy;  //значение суммирования правой части уравнения для uy
    double sum_e;   //значение суммироваиня правой части уравнения для энергии
    double last_sum_x;  //значение функции  на прошлом шаге для интегрирования рунге-кутты
    double last_sum_y;  //значение функции на прошлом шаге для интегрирования рунге-кутты
    double last_sum_ux; //значение суммирования на прошлом шаге для интегрования рунге-кутты
    double last_sum_uy; //значение суммирования на прошлом шаге для интегрирования рунге-кутты
    double last_sum_e;  //значение суммирования на прошлом шаге для интегрирования рунге-кутты
    int i;  //значение индекса строки ячейки в которой находится частица
    int j;  //значение индекса стодбца ячейки в которой находится частица
    int s;  //индекс следующей частицы находящейся в текущей ячейке
    ~particle(){ delete [] arr_N;}
 
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2013, 21:31
Ответы с готовыми решениями:

Ограничение трафика при использовании мобильного Интернет
Доброго всем форумчанам времени суток! Проблема: Последнее время интересует вопрос ограничения Интернет-трафика на Windows7 при...

Ограничение скорости передачи данных при использовании сокетов.
Требуется передавать большие объемы данных от сервера клиенту (коих одновременно может быть несколько). Каким образом можно ограничить...

Ограничение вращения камеры при использовании функции Transform.RotateAround
Здравствуйте! Я не могу разобраться как ограничить вращения камеры при использовании функции Transform.RotateAround. Я пытался использовать...

15
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:40
У new нет ограничений, ограничения есть лишь на свободную память.
Но для 28к экземпляров вашего класса получается ~5 мегабайт.
Скорее всего, ошибка в коде.
bad_alloc может вылетать, если вы где-то вышли за границы массива и тем самым повредили кучу. Тогда при последующих аллоках будет вылетать это исключение.
0
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:44  [ТС]
а почему тогда ошибка вылетает именно в момент выделения, а не использования? Ведь если бы я где то в коде выходила за пределы массива, то ошибка появилась бы там где я его использую.
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 21:44
Omus, если студия, попробуйте в релизе.
0
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:46  [ТС]
UnsKneD, попробовала, без изменений.(
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 21:52
Omus, понаблюдайте, сколько прога памяти жрёт перед падением?

Добавлено через 1 минуту
Omus, кстати вы ведь не выделяете память под
C++
1
int *arr_N; //массив индексов соседних частиц
1
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС]
UnsKneD, посмотрела. 2030Мб
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:53
Цитата Сообщение от Omus Посмотреть сообщение
а почему тогда ошибка вылетает именно в момент выделения, а не использования? Ведь если бы я где то в коде выходила за пределы массива, то ошибка появилась бы там где я его использую.
Не обязательно. Ошибка будет, если вы попытаетесь записать в чужой процесс или в read-only секцию.
А вот если вы выходите за границы массива, но при этом остаетесь в своем процессе, то при этом вы затираете какие-то данные, которые могут вами вообще не использоваться, но при этом они необходимы для выделения памяти.
0
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС]
UnsKneD, выделяю, но до этого момента не доходит дело
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:56
Цитата Сообщение от Omus Посмотреть сообщение
2030Мб
А, ну тогда все понятно. Я посчитал указатель указателем, а не массивом.
Тогда вам нужно просто сменить тип приложения на 64 битное.
32 битные приложения не могут съедать более 2 гигабайт памяти.
1
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:59  [ТС]
diagon, аа, понятно. Спасибо! А как это сделать?
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 22:00
Omus, у вас память кончилась, т.е вы где то её не очистили.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 22:03
Цитата Сообщение от Omus Посмотреть сообщение
diagon, аа, понятно. Спасибо! А как это сделать?
В английской студии project -> %project_name% properties. platform = x64.
Для русской будет что-то вроде "проект->свойства->платформа"
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 22:06
Ошбику при выделениии проверить просто:
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
class particle
{
public:
    double x;       //значение координаты x
    double last_x;  //значение х на прошлом шаге для интегрирования рунге-кутты
    double y;       //значение координаты y
    double last_y;  //значение у на прошлом шаге для интегрирования рунге-кутты
    double p;       //значение давления
    double rho;     //значение плотности
    double e;       //значение энергии
    double last_e;  //значение энергии на прошлом шаге для интегрирования рунге-кутты
    double ux;      //значение скорости по х
    double last_ux; //значение скорости по х на прошлом шаге для интегрирования рунге-кутты
    double uy;      //значение скорости по у
    double last_uy; //значение скорости по у на прошлом шаге для интегрирования рунге-кутты
    double m;       //значение массы частицы
    int count_N;    //количество соседок частицы
    int *arr_N;     //массив индексов соседних частиц
    double sum_ux;  //значение суммирования правой части уравнения для ux
    double sum_uy;  //значение суммирования правой части уравнения для uy
    double sum_e;   //значение суммироваиня правой части уравнения для энергии
    double last_sum_x;  //значение функции  на прошлом шаге для интегрирования рунге-кутты
    double last_sum_y;  //значение функции на прошлом шаге для интегрирования рунге-кутты
    double last_sum_ux; //значение суммирования на прошлом шаге для интегрования рунге-кутты
    double last_sum_uy; //значение суммирования на прошлом шаге для интегрирования рунге-кутты
    double last_sum_e;  //значение суммирования на прошлом шаге для интегрирования рунге-кутты
    int i;  //значение индекса строки ячейки в которой находится частица
    int j;  //значение индекса стодбца ячейки в которой находится частица
    int s;  //индекс следующей частицы находящейся в текущей ячейке
    
    ~particle()
    { 
        delete [] arr_N;
    }
 
};
 
 
 
int main() 
{ 
    particle *arr = new particle[28000];
            
      system("pause"); 
      return 0;
 
}
Если ошибки нет, то выделение здесь ни при чём. Код смотрите.
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 22:08
Так нагляднее будет,
Миниатюры
Существует ли ограничение при использовании new?  
0
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 22:14  [ТС]
Ура! Всем большое спасибо! Заработало)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2013, 22:14
Помогаю со студенческими работами здесь

Существует ли ограничение на количество ImageView?
Мне надо чтоб на екране отрисовывалось следующее: Фон и на нем комбинация из 4 рисунков. У 4 рисунков естественно фон прозрачный. Я хотел...

Существует ли ограничение на количество thread-ов на одно приложение?
Кто нибудь сталкивался с проблемой ограничения на количество tread-ов на одно приложение? Не дает запускать больше 5 (есть предположение...

Как перенести строку при записи в файл при использовании BufferedWriter?
Записываю в файл строковые данные, но никак не получается перенести строку, все пишется сплошняком. BufferedWriter bw = new...

При использовании оператора GOTO зацикливается программа при введении букв.
Приветствую всех новых знакомых в этом храме программирования. Я новичек, пытаюсь программировать в С++ недавно. У меня возник вопрос...

Ошибка при использовании ADODB.CONNECTION при работе с dbf-файлом
Добрый день! Написала макрос с использованием adodb.connection. макрос удаляет строки из файла dbf. На моем компьютере работает, поставила...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru