Ограниченный размер выделения C++

Я использую Visual Studio 2008. Я динамически объявил переменную big_massive:

unsigned int *big_massive = new unsigned int[1073741824]

Но когда я попытался отладить эту программу, я получил следующую ошибку: Неверный размер выделения: 4294967295 байт. Надеюсь, есть какой-нибудь способ избежать такой ошибки? Благодарю вас!


person Girl_Developer    schedule 10.12.2011    source источник
comment
32-битный проект Visual Studio. Но в 64-битном проекте я получил ошибку Необработанное исключение по адресу 0x000007fefd74cacd в test.exe: Исключение Microsoft C++: std::bad_alloc в ячейке памяти 0x002ef8b8.. P.S. Моя ОС - Windows 7 x64   -  person Girl_Developer    schedule 10.12.2011
comment
32-битная система не может выделить столько памяти, чтобы занять всю доступную в системе память.   -  person Seth Carnegie    schedule 10.12.2011


Ответы (3)


Это распределение просто невозможно в 32-битных системах x86 с sizeof(int)==4 (вы запрашиваете 4 ГБ). Общее адресное пространство процесса ограничено 4 ГБ, а сам процесс обычно ограничен меньше, чем это (2 ГБ или 3 ГБ для 32-разрядной Windows в зависимости от настроек boot.ini и версии Windows, не уверен, какое ограничение применяется для 32-разрядных процессов в 64-разрядной Windows, но 4Гб просто невозможно).

Для 64-битного случая вам потребуется 4 ГБ виртуальной памяти, чтобы поддержать это распределение, чтобы оно было успешным.

person Mat    schedule 10.12.2011

Объем виртуальной памяти на процесс в 32-разрядной системе Windows или 64-разрядной системе Windows, выполняющей 32-разрядную программу (WoW64): 2 147 483 648 Объем памяти, необходимый для хранения массива из 1 0 7 3 7 4 1 8 2 4 4-байтовых целых числа без знака: 4 294 967 296. Не может соответствовать объему памяти доступны, так что это недопустимое распределение.

person Jon Hanna    schedule 10.12.2011

  • 32-битная система не может получить доступ к более чем 4 ГБ памяти на процесс. Тем не менее, выделение 3 ГБ памяти нормально в ОС, поддерживающей ленивое выделение и чрезмерную фиксацию, даже если вы используете только первые 10 КБ, а ваш максимальный объем подкачки + память в любом случае составляет 1 ГБ. Но имейте в виду, что полагаться на это глупо в первую очередь.
  • Прежде чем пытаться использовать столько памяти, проверьте, не можете ли вы представить свои данные в более компактной форме. Если в вашем массиве есть дыры, или значения повторяются, или вы не используете полный 32-битный диапазон вашего int, или вам не нужно, чтобы эти значения имели определенный порядок, просто не используйте массив.
  • Помните, что оперативная память предназначена для временных данных. Если ваши данные должны быть записаны на диск, почему бы вам не использовать дисковое пространство в первую очередь? Вы даже можете использовать файлы с отображением памяти (вы выбираете часть файла и можете получить к ней доступ, как к памяти). Вам также могут понравиться альтернативы (более простые или нет) систем управления базами данных.
person BatchyX    schedule 10.12.2011