2015-05-01 3 views
-3

Я не могу выделить память для моего 1D массива в C++. Я пробовал использовать malloc и новый оператор. merge имеет значение 0, когда я использую malloc. В случае нового оператора я получаю исключение std::bad_alloc at memory location .... data_length имеет значение 131596814. У меня есть 8 ГБ бара, и много его бесплатно. Я использую Visual Studio 2012, а режим Debug/Release не влияет на него.Unsigned int array allocation

unsigned int* merge = (unsigned int*) malloc(2 * data_length * sizeof(unsigned int)); 

unsigned int* merge = new unsigned int[data_length * 2]; 

Я делаю что-то неправильно здесь?

+1

Компиляция в 32-битном режиме? – Mat

+0

Помните, что при распределении памяти распределение будет одним большим непрерывным куском, поэтому, если нет непрерывного почти 5 гигабайт памяти (4 раза 131596814), доступное распределение будет терпеть неудачу. –

+0

Помните, что если ваш компьютер имеет 8 ГБ памяти, он будет совместно использоваться другими исполняемыми файлами и задачами **. Возможно, у вашей программы не хватает этой суммы. Возможно, вам придется делать что-то старомодным способом и обрабатывать данные в кусках/фрагментах, в зависимости от того, сколько памяти выделено вашей программе. –

ответ

3

Массивы в C/C++ (и многие другие языки) должны быть выделены как один непрерывный блок памяти.

Вы пытаетесь выделить блок 1 ГБ - это почти невозможно, если выполнено для x86 (32 бит), особенно если это не очень первое выделение. Ограничение происходит из адресного пространства по умолчанию 2 ГБ в Windows (которое может быть увеличено до почти 4 ГБ, если ваша хост-система равна x64, а ваш процесс помечен как «большой адрес») и фрагментация адресного пространства, вызванная DLL, загружаемой в полуслучайные местоположения в адресном пространстве, а также предыдущие распределения памяти программой.

Исправление:

  • редизайн Программа не требует огромных массивов - распределение является только первой проблемой есть. Индексирование (не каждый язык поддерживает индексы), для роста существующего массива требуется полная копия.
  • Рассмотрите возможность использования библиотек, которые предоставляют «chunked» массивы, которые хранят данные в виде списка меньших фрагментов при экспонировании обычного интерфейса на основе массива/итератора.
  • Если вы должны обрабатывать большое количество данных, переключение на x64 (64 бит) в основном является требованием в качестве адреса ограниченное пространство практически исчезает, и 1 ГБ блоков адресного пространства легко найти.
+0

Спасибо, x64 помог, но я действительно подумаю об использовании подхода chunk – benderto

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