Не могу выделить 2-4 Гб оперативной памяти с помощью new[]/ C++/Linux/ x86_64

Для этого простого теста и linux box с 4Gb или RAM, 0byte swap и CPU в режиме x86_64, я не могу выделить более 1 Gb массива.

Source:

#include <cstdio>
int main()
{
 for(int i=0;i<33;i++) { 
  char*a=new char[1<<i];
  *a=1;
  delete[]a; 
  printf("%d\n",i);
  fflush(stdout);
 }
}

Run:

$ file test
test: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV)
$ ./test
...
24
25
26
27
28
29
30
terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
Aborted

Нет ulimit для памяти:

virtual memory          (kbytes, -v) unlimited
data seg size           (kbytes, -d) unlimited

Почему ошибка?

Glibc - 2.3.4, ядро - 2.6.9

UPDATE: Компилятор - gcc4.1

Спасибо! В тесте определенно есть ошибка, 1ull< дает мне до 31 (2gb). Эта ошибка была непреднамеренной. Но реальный неудачный код

 for(j=0;j<2;j++)
  for(i=0;i<25;i++)
   some_array[j][i] = new int[1<<24];

так что в реальном коде нет переполнения знака.

Размер int - 4 байта:

$ echo 'main(){return sizeof(int);}'| gcc -x c - && ./a.out; echo $?
4

каждый запрос будет на 1<<24 * 4 = 1<<26; всего потребуется 2*25*(1<<26) 3355443200 байт + 50*sizeof(pointer) для some_array + 50*(размер new[] overhead).

6
задан osgx 1 February 2013 в 17:42
поделиться