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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Ситуация: Я создала класс, описание которого ниже, и хочу выделить память под массив экземпляров этого класса размерностью 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2013, 21:31
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 1 минуту
Omus, кстати вы ведь не выделяете память под
C++
1
int *arr_N; //массив индексов соседних частиц
1
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС] 7
UnsKneD, посмотрела. 2030Мб
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:53 8
Цитата Сообщение от Omus Посмотреть сообщение
а почему тогда ошибка вылетает именно в момент выделения, а не использования? Ведь если бы я где то в коде выходила за пределы массива, то ошибка появилась бы там где я его использую.
Не обязательно. Ошибка будет, если вы попытаетесь записать в чужой процесс или в read-only секцию.
А вот если вы выходите за границы массива, но при этом остаетесь в своем процессе, то при этом вы затираете какие-то данные, которые могут вами вообще не использоваться, но при этом они необходимы для выделения памяти.
0
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС] 9
UnsKneD, выделяю, но до этого момента не доходит дело
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:56 10
Цитата Сообщение от Omus Посмотреть сообщение
2030Мб
А, ну тогда все понятно. Я посчитал указатель указателем, а не массивом.
Тогда вам нужно просто сменить тип приложения на 64 битное.
32 битные приложения не могут съедать более 2 гигабайт памяти.
1
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:59  [ТС] 11
diagon, аа, понятно. Спасибо! А как это сделать?
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 22:00 12
Omus, у вас память кончилась, т.е вы где то её не очистили.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 22:03 13
Цитата Сообщение от Omus Посмотреть сообщение
diagon, аа, понятно. Спасибо! А как это сделать?
В английской студии project -> %project_name% properties. platform = x64.
Для русской будет что-то вроде "проект->свойства->платформа"
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 22:06 14
Ошбику при выделениии проверить просто:
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
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
21.04.2013, 22:08 15
Так нагляднее будет,
Миниатюры
Существует ли ограничение при использовании new?  
0
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 22:14  [ТС] 16
Ура! Всем большое спасибо! Заработало)
0
21.04.2013, 22:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2013, 22:14
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru