Для этого простого теста и 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).