46Fermer48
ThibautLe 10/01/2011 à 17:30
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".