J'ai vérifié vite fait. L'utilisation de
calloc ne garantie pas que l'espace réservé sera utilisable. Cette fonction semble avoir un fonctionnement très malin...
Le code suivant alloue 20 Go de mémoire alors que mon ordinateur n'en a que 2.
#include <stdlib.h>
#include <stdio.h>
#define T (20480)
int main(void) {
int i;
char *P[T];
for (i=0 ; i<T ; i++) {
P[i]= calloc(1024,1024);
memset(P[i], -1, 1024*1024);
}
for (i=0 ; i<T ; i++) free(P[i]);
return (0);
}
L'ordinateur se met rapidement à swaper, l'exécution est très ralentie. J'arrête le programme avant que tout saute.
Lorsqu'on retire le
memset, le système ne swape plus et l'exécution est très brève.
Cela semble indiquer que la mémoire n'est réellement allouée que lorsqu'on y accède. Par conséquent,
calloc et
malloc auraient le même "bug".