2010-09-13 10 views
0

Я использую визуальную студию 2008 для разработки. Моя программа должна иметь дело с огромным объемом памяти. Ошибка возникает, когда моя программа пытается выделить 512M поплавковый массив. Код:[Проблема с распределением памяти] Необработанное исключение: исключение Microsoft C++: std :: bad_alloc в ячейке памяти

int size = 512*512*512; 
float *buffer = new float[size]; 

Перед этим распределением программа уже потребляет около 554 Мб памяти. Мой рабочий стол имеет основную память 4G, и я использую Windows xp 32bits.

Как избежать ошибки распределения? Большое спасибо за ваш вклад!

+0

Не решение, но почему вы не используете 'std :: vector'? – GManNickG

+0

Как это 512M? Инициализация переменной должна быть 'int size = 512 * 1024 * 1024;'. Кроме того, я бы изменил тип данных 'size' на' size_t'. – Praetorian

+0

Есть ли причина, по которой вам нужен массив 512M (128M * sizeof (float))? Можете ли вы разбить это на более мелкие куски? Можете ли вы перейти на 64-битную систему с большей памятью? –

ответ

4

Ваш массив требует слишком много смежной памяти. Ваша программа имеет немного меньше 2 гигабайт доступной виртуальной памяти, но это адресное пространство разбивается на куски кода, данных и разных куч. Память выделяется из свободного пространства между этими кусками. В 32-разрядной операционной системе вы можете получить ~ 650 МБ, когда вы сразу же выделите. Это идет на юг, когда ваша программа начинает использовать память. Сумма всех распределений памяти по-прежнему составляет ~ 2 ГБ.

Используйте 64-разрядную операционную систему или разделите свои структуры данных. Утилита VMMap SysInternals может дать вам представление о отображении виртуальной памяти вашей программы.

+0

Использование переключателя компоновщика/LARGEADDRESSAWARE может привести вас к пределу 2 ГБ. Я думаю, что все в порядке до 3 ГБ. Конечно, ваша точка зрения о непрерывной памяти сохраняется. –

+0

Мех, получение опции загрузки для работы - это руб. –

+0

Программное обеспечение, которое вы рекомендуете, довольно хорошо. Благодарю. – Aaron

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