Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:31     Существует ли ограничение при использовании new? #1
Здравствуйте.
Ситуация: Я создала класс, описание которого ниже, и хочу выделить память под массив экземпляров этого класса размерностью 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;}
 
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:40     Существует ли ограничение при использовании new? #2
У new нет ограничений, ограничения есть лишь на свободную память.
Но для 28к экземпляров вашего класса получается ~5 мегабайт.
Скорее всего, ошибка в коде.
bad_alloc может вылетать, если вы где-то вышли за границы массива и тем самым повредили кучу. Тогда при последующих аллоках будет вылетать это исключение.
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:44  [ТС]     Существует ли ограничение при использовании new? #3
а почему тогда ошибка вылетает именно в момент выделения, а не использования? Ведь если бы я где то в коде выходила за пределы массива, то ошибка появилась бы там где я его использую.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.04.2013, 21:44     Существует ли ограничение при использовании new? #4
Omus, если студия, попробуйте в релизе.
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:46  [ТС]     Существует ли ограничение при использовании new? #5
UnsKneD, попробовала, без изменений.(
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.04.2013, 21:52     Существует ли ограничение при использовании new? #6
Omus, понаблюдайте, сколько прога памяти жрёт перед падением?

Добавлено через 1 минуту
Omus, кстати вы ведь не выделяете память под
C++
1
int *arr_N; //массив индексов соседних частиц
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС]     Существует ли ограничение при использовании new? #7
UnsKneD, посмотрела. 2030Мб
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:53     Существует ли ограничение при использовании new? #8
Цитата Сообщение от Omus Посмотреть сообщение
а почему тогда ошибка вылетает именно в момент выделения, а не использования? Ведь если бы я где то в коде выходила за пределы массива, то ошибка появилась бы там где я его использую.
Не обязательно. Ошибка будет, если вы попытаетесь записать в чужой процесс или в read-only секцию.
А вот если вы выходите за границы массива, но при этом остаетесь в своем процессе, то при этом вы затираете какие-то данные, которые могут вами вообще не использоваться, но при этом они необходимы для выделения памяти.
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:53  [ТС]     Существует ли ограничение при использовании new? #9
UnsKneD, выделяю, но до этого момента не доходит дело
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 21:56     Существует ли ограничение при использовании new? #10
Цитата Сообщение от Omus Посмотреть сообщение
2030Мб
А, ну тогда все понятно. Я посчитал указатель указателем, а не массивом.
Тогда вам нужно просто сменить тип приложения на 64 битное.
32 битные приложения не могут съедать более 2 гигабайт памяти.
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 21:59  [ТС]     Существует ли ограничение при использовании new? #11
diagon, аа, понятно. Спасибо! А как это сделать?
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.04.2013, 22:00     Существует ли ограничение при использовании new? #12
Omus, у вас память кончилась, т.е вы где то её не очистили.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.04.2013, 22:03     Существует ли ограничение при использовании new? #13
Цитата Сообщение от Omus Посмотреть сообщение
diagon, аа, понятно. Спасибо! А как это сделать?
В английской студии project -> %project_name% properties. platform = x64.
Для русской будет что-то вроде "проект->свойства->платформа"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.04.2013, 22:06     Существует ли ограничение при использовании new? #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;
 
}
Если ошибки нет, то выделение здесь ни при чём. Код смотрите.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
21.04.2013, 22:08     Существует ли ограничение при использовании new? #15
Так нагляднее будет,
Миниатюры
Существует ли ограничение при использовании new?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 22:14     Существует ли ограничение при использовании new?
Еще ссылки по теме:

При использовании getline ввод при Enter заканчивается только после пробела C++
C++ Ошибка при использовании %
C++ Ошибка при использовании reverse_iterator

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

Или воспользуйтесь поиском по форуму:
Omus
 Аватар для Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
21.04.2013, 22:14  [ТС]     Существует ли ограничение при использовании new? #16
Ура! Всем большое спасибо! Заработало)
Yandex
Объявления
21.04.2013, 22:14     Существует ли ограничение при использовании new?
Ответ Создать тему
Опции темы

Текущее время: 17:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru