Memória máxima que pode ser alocada dinamicamente e em tempo de compilação em c ++

Estou brincando para entender quanta memória pode ser alocada. Inicialmente eu pensei que a memória máxima que pode ser alocada é igual à memória física (RAM). Eu verifiquei minha RAM no Ubuntu 12.04 executando o comando como mostrado abaixo:

~$ free -b
             total       used       free     shared    buffers     cached
Mem:    3170848768 2526740480  644108288          0  265547776 1360060416
-/+ buffers/cache:  901132288 2269716480
Swap:   2428497920          0 2428497920

Como mostrado acima, a memória física total é 3Gig (3170848768 bytes), dos quais apenas 644108288 bytes são livres, então eu assumi que posso no máximo alocar apenas essa quantidade de memória. Eu testei escrevendo o pequeno programa com apenas duas linhas abaixo:

char * p1 = new char[644108290] ;
delete p1;

Como o código funcionou perfeitamente, significa que ele alocou memória com sucesso. Também tentei alocar a memória maior que a memória livre física disponível, ainda que não tenha lançado nenhum erro. Então por questão

memória máxima que malloc pode alocar

Eu pensei que deve estar usando a memória virtual.Então eu testei o código para memória de troca livre e também funcionou.

char * p1 = new char[2428497920] ;
delete p1;

Eu tentei alocar a troca livre mais bytes livres de RAM de memória

char * p1 = new char[3072606208] ;
delete p1;

Mas este código de tempo falhou jogando obad_alloc exceção.Por que o código não funcionou desta vez.

Agora aloquei a memória em tempo de compilação em um novo programa como mostrado abaixo:

char p[3072606208] ;
char p2[4072606208] ;
char p3[5072606208];
cout<<"Size of array p = " <<sizeof p <<endl;
cout<<"Size of array p2 = " <<sizeof p2<<endl;
cout<<"Size of array p2 = " <<sizeof p3;

Os shows expostos

Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912

Você poderia por favor me ajudar a entender o que está acontecendo aqui? Por que permitiu que a memória fosse alocada no tempo de compilação, mas não em dinamicamente. Quando alocado tempo de compilação, comop ep1 foram capazes de alocar memória maior que swap mais memória RAM livre. Enquanto quep2 falhou. Como exatamente isso está funcionando? Isso é algum comportamento indefinido ou comportamento específico. Obrigado pela ajuda. Eu estou usando o Ubuntu 12.04 e o gcc 4.6.3.

questionAnswers(5)

yourAnswerToTheQuestion