2009-11-14 5 views
4

Je suis nouveau à C. J'essaie de me familiariser avec malloc + gratuit. J'ai codé le test suivant mais pour une raison quelconque la mémoire n'est pas libérée complètement (le haut indique encore environ 150 Mo de mémoire allouée au traitement). Pourquoi donc?Une certaine mémoire semble être allouée après malloc() et free()

#include <stdio.h> 
#include <malloc.h> 

typedef struct { 
    char *inner; 
} structure; 

int main() 
{ 
    int i; 
    structure** structureArray; 

    structureArray = (structure**)malloc(sizeof(structure*)*1000*10000); 
    for (i = 0; i < 1000*10000;i++) 
    { 
     structureArray[i] = (structure*) malloc(sizeof(structure)); 
     structureArray[i]->inner = (char*) malloc(sizeof(char)*1000*1000*1000); 
    } 

    printf("freeing memory"); 
    for (i = 0; i < 1000*10000;i++) 
    { 
     free(structureArray[i]->inner); 
     free(structureArray[i]); 
    } 
    free(structureArray); 

    system("sleep 100"); 
    return 0; 
} 

Makefile lui correspondant:

all: test.c 
    gcc -o test test.c 
    ./test & 
    top -p `pidof ./test` 
    killall ./test 
+2

L'avez-vous testé avec la bavette à la place? ou valgrind? Ils vous donneront de meilleures statistiques de fuite de mémoire. –

+1

Vous rendez-vous compte de la quantité de mémoire que vous essayez d'allouer? – rlbond

+0

Qui s'en soucie? C'est un système 64 bits - l'espace d'adressage n'est pas exactement une ressource rare. Le système ne vous a jamais donné le contrôle exclusif sur la mémoire physique (RAM) de toute façon. –

Répondre

11

top vous indiquera la quantité de mémoire physique affectée à votre processus. La mémoire virtuelle est une abstraction au-dessus de la mémoire physique, et malloc/free fournit une abstraction au-dessus de cela.

malloc réserve de l'espace dans le tas de votre programme. Le tas est simplement une zone de l'espace d'adressage virtuel de votre programme utilisé pour le stockage temporaire. Comme vous appelez malloc plus, le tas est développé en utilisant l'appel système brk. Cependant, bien que la taille virtuelle de votre tas augmente, la mémoire physique n'est réellement affectée que lorsque vous lisez ou écrivez dans votre mémoire nouvellement allouée. Par exemple, puisque vous n'écrivez jamais dans la mémoire allouée aux champs inner de vos enregistrements, ces allocations n'occupent aucune RAM physique. Il suffit de libérer les parties du tas allouées par malloc

free Cela ne réduit pas nécessairement la taille virtuelle du tas, de sorte que la mémoire physique associée ne peut pas être libérée. C'est pourquoi vous ne voyez pas une réduction de l'utilisation de la mémoire physique.

+1

+1. «garder» la mémoire libre est un point important. –

+0

Merci, cette explication est très générale. –

3

probablement quelque chose à cause de vous allouer de l'ordre de 10000000000000000 octets (1000 * 10000 * 1000 * 1000 * 1000) = ~ 10000000000 Moctets = 10000000 Gbytes qui enveloppe votre mémoire système plusieurs fois.

+0

Non si l'OP est sur un système 64 bits. –

+0

Sur Linux 64 bits, vous vous en sortez malgré l'allocation de beaucoup de mémoire car il utilise un allocateur paresseux. Presque partout ailleurs, vous seriez sorti de la mémoire (virtuelle) il y a longtemps. Et sur Linux, vous seriez hors de la mémoire. Je veux voter pour vous, mais vous devez indiquer que ce n'est pas aussi simple que d'envelopper plusieurs fois la mémoire du système. –

+0

La mémoire système désigne la mémoire physique par opposition à la mémoire virtuelle. Il semble improbable que le questionneur dispose d'un système avec 10000000 Go de mémoire physique donc le programme n'est probablement pas ce qui est prévu. – dajobe

6

La gestion de la mémoire Unix est paresseux, il n'est pas garanti de libérer de la mémoire à moins que quelqu'un n'en ait vraiment besoin. Here is bon article.

Aussi, je vous recommande de vérifier les résultats malloc(), vous trouverez certainement au moins certains d'entre eux ont échoué.

+0

L'échec du malloc sera le fait que le système d'exploitation ne laissera pas votre processus allouer plus de mémoire. – Evan

Questions connexes