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

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

Войти
Регистрация
Восстановить пароль
 
 
Omus
1 / 1 / 1
Регистрация: 07.04.2013
Сообщений: 49
#1

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

21.04.2013, 21:31. Просмотров 457. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 21:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Существует ли ограничение при использовании new? (C++):

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

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

При использовании getline ввод при Enter заканчивается только после пробела - C++
int main() { string slovo; double n; while(slovo != "пока" ) { getline (cin,slovo,' '); if (slovo ==...

Ошибка при использовании gets() - C++
Не могу понять, почему при второй итерации цикла программа выдает ошибку и закрывается при запросе фамилии. #include "stdafx.h" ...

Ошибка при использовании % - C++
(условие задачи, код и ошибки при коомпиляции на скрине) Здравствуйте, задача простая, как и ее решение, на фортране бы уже пять раз...

Затруднение при использовании SYSTEMTIME - C++
Здравствуйте. У меня возникла проблема с данной простой программкой, ее суть - в изменении даты на некоторый срок и в последующем...

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

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

Ошибка при использовании STL - C++
Начал знакомиться с STL, и возникли проблемы. Вот суть: Имеется дочерний класс, одно поле которого является динамическим массивом. При...

Ошибки при использовании stringstream - C++
Текст программы: #include <stdio.h> #include <iostream> #include <string.h> using namespace std; int main()...

Ошибка при использовании new[] / delete[] - C++
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет :) ). Для начала приведу...

Ошибка при использовании delete - C++
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю что не так делаю: class CMenu { ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
21.04.2013, 22:08
Ответ Создать тему
Опции темы

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