[SYS2] Allocation dynamique - Gestion de la mémoire

Voir le sujet précédent Voir le sujet suivant Aller en bas

[SYS2] Allocation dynamique - Gestion de la mémoire

Message  moshabesi le Lun 07 Mai 2012, 12:03

Je sais que malloc() fait une sur-réservation et que free() ne libère pas entièrement la mémoire. J'ai tester un code qui vérifie tout ça :
Code:

extern char _end;
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
 
        char * res;
   int tas,rupt,esp;
   printf("\n Avant toute réservation de mémoire\n --------------------------\n");
   tas=sbrk(0);
   printf("Position de fin du tas : %p\n",tas);
   rupt=&_end;
   printf("Point de rupture : %p\n",rupt);
   esp=tas-rupt;
   printf("Espace entre fin du tas et pdr : %d bytes \n",esp);
   printf("Pages allouées pour malloc %f\n",(tas-rupt-esp)/4096.0);
   printf("soit %d bytes\n",tas-rupt-esp);
 
 
 
    int nbEntier = 0, i = 0;
    int* tabEntier ; // Ce pointeur va servir de tableau après l'appel du malloc
 
    // On demande le nombre d'entiers à l'utilisateur
    printf("Combien d'entier voulez vous stockés ? ");
    scanf("%d", &nbEntier);
 
    if (nbEntier > 0)
    {
        tabEntier = malloc(nbEntier  * sizeof(int)); 
        if (tabEntier== 0)
        {
            exit(0); //
        }
 
        // On demande les entiers
        for (i = 0 ; i < nbEntier  ; i++)
        {
            printf("Entier n° %d ? ", i + 1);
            scanf("%d", &tabEntier[i]);
        }
 
        // On affiche les entiers un à un
        printf("\n\nVos entiers sont les suivants :\n");
        for (i = 0 ; i < nbEntier  ; i++)
        {
            printf("%d \n", tabEntier[i]);
        }
   tas=sbrk(0);
   printf("Position de fin du tas : %p\n",tas);
   rupt=&_end;
   printf("Point de rupture : %p\n",rupt);
   printf("Espace entre fin du tas et pdr : %d bytes \n",tas-rupt);
   printf("Pages allouées pour malloc %f\n",(tas-rupt-esp)/4096.0);
   printf("soit %d bytes\n",tas-rupt-esp);
 
        free(tabEntier);
 
 
        printf("\nAffichage apres free():\n");
 
        // On affiche les âges stockés un à un
        printf("\n\nVos entiers sont les suivants:\n");
        for (i = 0 ; i < nbEntier  ; i++)
        {
            printf("%d\n", tabEntier[i]);
        }
 
 
 
    }
 
    return 0;
    }

Mon résultat :


Je ne comprend pas!! il alloue tout le temps 33 page même si je demande qu'un entier et aussi pourquoi après le free() il libère que le première entier et pas le reste..

moshabesi

Nombre de messages : 9
Age : 26
Prénom : Moshab
Date d'inscription : 22/09/2009

Revenir en haut Aller en bas

Re: [SYS2] Allocation dynamique - Gestion de la mémoire

Message  galaeron le Lun 07 Mai 2012, 13:25

Avant de commencer :
&end est constant
la valeur de retour de sbrk vaut 0 ou -1
Par conséquent quel est l’intérêt de "tas-rupt"

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [SYS2] Allocation dynamique - Gestion de la mémoire

Message  moshabesi le Lun 07 Mai 2012, 13:57

C'est brk() qui renvoie 0 ou -1 mais sbrk() renvoie la position du fin de tas. Du moins c'est ce qui est mis dans les commentaires du LaboMemoire 01-04 Very Happy

moshabesi

Nombre de messages : 9
Age : 26
Prénom : Moshab
Date d'inscription : 22/09/2009

Revenir en haut Aller en bas

Re: [SYS2] Allocation dynamique - Gestion de la mémoire

Message  galaeron le Lun 07 Mai 2012, 15:13

Au temps pour moi, j'avais mal lu. Donc pour le free, en c (et au contraire de java) il n'y a pas de garbage collector et par conséquent, la mémoire est considérée comme vide mais elle contient toujours les infos.
Pour ce qui est des 33 pages cela dépend de la politique d'allocation j'imagine ... As tu essayé en indiquant un contenu > 33 pages?

galaeron

Nombre de messages : 113
Age : 28
Prénom : Arthur
Statut : 3IR12
Date d'inscription : 29/06/2011

Revenir en haut Aller en bas

Re: [SYS2] Allocation dynamique - Gestion de la mémoire

Message  Contenu sponsorisé Aujourd'hui à 01:11


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum