2016-08-07 2 views
0

C++ Я около +30 динамически выделенных массивов в моей программе, что площадь каждый определенную как следующее:сбоя программы при назначении значения слишком много динамически выделенных массивов -

int Nx = 240; 
int Ny = 240; 
double* array = new double(Nx*Ny); 

можно присвоить значения 16 из них, но как только я доберусь до 17-го, он бросает сегрегат!

Это код, который бросает его, что совершенно нормально!

for (int i = 0; i < Nx*Ny; i++) { 
    array[i] = 0; 
} 

Я действительно понятия не имею, почему я думал бежать из кучи, но так как у меня есть 4 Гб оперативной памяти, что должно быть невозможно! Я использую MSVS15 и запускаю программу на Windows 10!

Любая идея, почему это происходит? Точная ошибка:

Exception thrown at 0x00298389 in ecostress.exe: 0xC0000005: Access violation writing location 0x01D2B000. If there is a handler for this exception, the program may be safely continued.

+2

p.s. рассмотрите возможность использования 'std :: vector', если это подходит для вашего приложения. – Hurkyl

+0

Вы также можете использовать 'memset' для нулевой памяти, что, вероятно, быстрее. – Inline

ответ

6

Простой опечатка:

double* array = new double(Nx*Ny); // creates a single, initialized double 
double* array = new double[Nx*Ny]; // creates an array of doubles 
+0

Мое гудение! если у вас есть идеи, сколько дней я потратил на это. Спасибо огромное! –

+0

@sorry_I_wont легко: – artm

3

@Hurkyl правильно ответил.

Я просто хотел бы добавить, что если есть на C++, то лучше использовать векторы:

vector<int> array(Nx*Ny); 

Чтобы получить доступ к указателю непосредственно вы можете использовать &array[0], хотя нет, как правило, нет причин, чтобы сделать это, и вы все еще можете сделать array[0] = 0.

Преимущество vector и stl заключается в том, что он автоматически освобождает память благодаря деструктору.

Смежные вопросы