2013-07-11 5 views
1

Я пытался объявить массив с плавающей запятой 1024 × 1024, но появилось только окно, в котором говорилось, что project_name.exe перестает работать ... с параметрами для отладки или закрытия программы. Раньше мне удалось объявить 1000 на 2 массива int. Я как бы искал интернет по возможной причине, и они сказали, что проблема с памятью, «переполнение стека/кучи» в точности. Они сказали, что это еще хуже для случая плавания.Переполнение стека/кучи при объявлении большого массива

Мне нужно только до 5 или 6 знаков после запятой.

Любые советы или предложения? Я не сталкивался с этой проблемой на python и в Matlab. Я использую Microsoft Visual Studio 2010.

+1

Если вы не можете устранить проблему, сидя перед реальным кодом, при всей вашей рабочей среде в вашем распоряжении, какая надежда у нас получается, без инструментов и без видимости? Это * проблема с памятью; вы должны будете немного отладить и выяснить, почему. –

+0

Попробуйте сделать 1024 отдельных размера поплавкового массива размером 1024, если ваш 2D-массив не должен быть смежным. –

ответ

11

Вы объявляете это как локальную переменную в функции или методе? Если это так, это классический переполнение стека. Для VS2010 см. http://msdn.microsoft.com/en-us/library/8cxs58a6%28v=vs.100%29.aspx

Запасное значение определяет общее распределение стека в виртуальной памяти. Для компьютеров x86 и x64 размер стека по умолчанию составляет 1 МБ. На чипсете Itanium размер по умолчанию составляет 4 МБ.

Таким образом, массив чисел с плавающей запятой 1024x1024 (с учетом 4 байтов на каждый поплавок) в колоссальном 4mb - вы проплыли прямо через предел стека по умолчанию.

Обратите внимание, что даже если у вас действительно есть Itanium, вы не собираетесь быть в состоянии использования все это 4mb - параметры, например, также должны быть сохранены в стеке см http://www.csee.umbc.edu/~chang/cs313.s02/stack.shtml

Теперь у вас может просто увеличить размер стека, но в какой-то день вам понадобится использовать большой массив, так что это война с истощением, которую вы не выиграете. Это проблема, которую лучше всего решить, если она уйдет; Другими словами, вместо:

float stuff[1024 * 1024]; 

Вы объявим его как:

float *stuff = new float[1024 * 1024]; 
// do something interesting and useful with stuff 
delete[] stuff; 

Вместо того, чтобы быть в стеке это теперь будет выделено в куче. Обратите внимание, что это не та же куча, что упоминается Робертом Харви в его ответе; у вас нет ограничений в опции/HEAP.

+3

Или просто используйте вектор, он сделает все это для вас, 'vector >' будет выделять его данные в кучу и автоматически освобождать его с помощью RAII – jozefg

+0

@jozefg - совершенно правильно. –

+0

Однако обратите внимание, что то же самое относится к программам C (за исключением использования malloc/free вместо new/delete), поэтому ответ в целом полезен, не используя векторы. –

2

Вы объявляете это в стеке, возможно? Объекты, которые должны быть в куче!

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