Memoria máxima que se puede asignar de forma dinámica y en tiempo de compilación en c ++

Estoy jugando para entender cuánta memoria se puede asignar. Inicialmente pensé que la memoria máxima que se puede asignar es igual a la memoria física (RAM). Revisé mi RAM en Ubuntu 12.04 ejecutando el comando como se muestra a continuación:

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

Como se muestra arriba, la memoria física total es 3Gig (3170848768 bytes), de los cuales solo 644108288 bytes están libres, así que asumí que puedo asignar al máximo solo esta cantidad de memoria. Lo probé escribiendo el pequeño programa con solo dos líneas a continuación:

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

Dado que el código se ejecutó perfectamente, significa que asignó memoria correctamente. También intenté asignar la memoria mayor que la memoria libre física disponible, pero no arrojó ningún error. Entonces por pregunta

memoria máxima que malloc puede asignar

Pensé que debía estar usando la memoria virtual. Así que probé el código para la memoria de intercambio libre y también funcionó.

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

Intenté asignar el intercambio libre más los bytes de memoria RAM libres

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

Pero este código de tiempo falló tirando elbad_alloc Excepción. Por qué el código no funcionó esta vez.

Ahora asigné la memoria en tiempo de compilación en un nuevo programa como se muestra a continuación:

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;

Los espectáculos de salida

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

¿Podría por favor ayudarme a entender lo que está pasando aquí? ¿Por qué permitió que la memoria se asignara en el momento de la compilación pero no de forma dinámica? Cuando se asigna el tiempo de compilación comop yp1 fueron capaces de asignar memoria mayor que el intercambio más memoria RAM libre. Donde comop2 ha fallado. ¿Cómo funciona exactamente esto? Es este un comportamiento indefinido o un comportamiento específico del sistema operativo. Gracias por tu ayuda. Estoy usando Ubuntu 12.04 y gcc 4.6.3.

Respuestas a la pregunta(5)

Su respuesta a la pregunta