IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Libération mémoire par un free()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Par défaut Libération mémoire par un free()
    Bonjour,

    J'utilise un compilateur gcc pour DOS sous Windows XP.

    Lorsque j'exécute le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    main()
    {
       char *str;
     
       getchar();
       str = malloc(100000000*sizeof(char));
       getchar();
       free(str);
       str = NULL;
       getchar();
       exit(0);
    }
    Lorsque j'appuie une première fois sur la touche Entrée, je vois bien dans le gestionnaire de tâches de Windows (onglet Performances) que 100 Mo de plus sont utilisés, ce qui est logique.

    Lorsque j'appuie une seconde fois sur la touche Entrée, malgrès que le free soit exécuté, j'ai toujours les 100 Mo d'occupés.

    Ce n'est que lorsque j'appuie une troisième fois sur la touche Entrée et donc que je quitte le programme que les 100 Mo sont libérés.

    Comment faire pour les libérer en cours d'exécution du programme ? car j'ai écris un programme qui fait beaucoup d'allocations/déallocations et je sature rapidement la mémoire (malloc incapable d'allouer et retournant NULL).

    Merci.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Oué ce constat avait deja été fait, et je crois que c'est la meme chose sous linux : en fait quand on libère avec free, on dit juste au système qu'on va plus utiliser la zone allouée, si un autre processus à besoin de cette memoire bein il pourra la prendre.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Salut,

    Oué ce constat avait deja été fait, et je crois que c'est la meme chose sous linux : en fait quand on libère avec free, on dit juste au système qu'on va plus utiliser la zone allouée, si un autre processus à besoin de cette memoire bein il pourra la prendre.
    faux..

    Elle est libre pour ce processus, et uniquement pour lui, sauf si il se trouve que c'est le dernier segment de mémoire utilisé par le prog... auquel cas un affichage de la mémoire consommée diminuera d'autant. Sinon la mémoire reste "physiquement" attribuée au processus en cours..

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par rebirth03 Voir le message
    Comment faire pour les libérer en cours d'exécution du programme ? car j'ai écris un programme qui fait beaucoup d'allocations/déallocations et je sature rapidement la mémoire (malloc incapable d'allouer et retournant NULL).
    Ca ne devrait pas saturer la memoire. En effet la memoire liberee n'est pas "rendue" au systeme (et donc elle apparait dans le gestionnaire des taches) mais elle est libre et sera reutilisee pour des allocations ulterieures de ce processus.

    Es-tu certain que tu liberes bien tout dans ton programme ?
    N'arrives-tu pas a la situation ou apres avoir allouer un grand nombre de petits espaces memoire et liberer certains, il ne te reste plus d'espace contigu suffisament grand pour les allocations que tu tentes ?

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par rebirth03 Voir le message
    J'utilise un compilateur gcc pour DOS sous Windows XP.
    What ? Pas de DOS sous XP. Tu veux dire en mode console ?
    Lorsque j'appuie une première fois sur la touche Entrée, je vois bien dans le gestionnaire de tâches de Windows (onglet Performances) que 100 Mo de plus sont utilisés, ce qui est logique.

    Lorsque j'appuie une seconde fois sur la touche Entrée, malgrès que le free soit exécuté, j'ai toujours les 100 Mo d'occupés.

    Ce n'est que lorsque j'appuie une troisième fois sur la touche Entrée et donc que je quitte le programme que les 100 Mo sont libérés.
    Ce n'est pas ce que je constate sur mon XP :

    Comment faire pour les libérer en cours d'exécution du programme ? car j'ai écris un programme qui fait beaucoup d'allocations/déallocations et je sature rapidement la mémoire (malloc incapable d'allouer et retournant NULL).
    Il doit y avoir une fuite mémoire. Pur le savoir je te conseille purify ou mon petit outil SYSALLOC

    http://emmanuel-delahaye.developpez.com/clib.htm

  6. #6
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Par défaut
    Merci pour vos réponses

    Je dois donc avoir un problème dans mon programme ...
    J'ai appris que le free ne libérait la mémoire que pour le processus en cours, chose que j'ignorais jusqu'à maintenant.

    Quand au DOS, je voulais effectivement parler de l'émulation DOS de XP

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par rebirth03 Voir le message
    J'ai appris que le free ne libérait la mémoire que pour le processus en cours, chose que j'ignorais jusqu'à maintenant.
    Oui, enfin ce comportement n'est pas lie au C mais a l'environnement.

    Vu du C, free libere la memoire.
    Vu du systeme, ca peut rendre la memoire disponible pour le processus courant, la liberer entierement et la rendre disponible pour l'ensemble des processus, etc.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gl Voir le message
    Oui, enfin ce comportement n'est pas lie au C mais a l'environnement.

    Vu du C, free libere la memoire.
    Vu du systeme, ca peut rendre la memoire disponible pour le processus courant, la liberer entierement et la rendre disponible pour l'ensemble des processus, etc.
    Pour jouer, ceci que j'ai allègrement pompé d'un post du SdZ (merci magma) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <windows.h>
    #include <stdio.h>
     
    int main (void)
    {
          MEMORYSTATUS ms;
     
          // Memoire
          GlobalMemoryStatus (&ms); // ou GlobalMemoryStatusEx()
          printf ("\nMemoire\n");
          printf ("  Totale   : %7ld Ko\n", ms.dwTotalPhys / 1024);
          printf ("  Libre    : %7ld Ko\n", ms.dwAvailPhys / 1024);
          printf ("  Utilisee : %7ld %%\n", ms.dwMemoryLoad);
       return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Allocation mémoire par session
    Par joziel dans le forum Oracle
    Réponses: 7
    Dernier message: 09/07/2007, 16h53
  2. Problème de libération mémoire
    Par chrono23 dans le forum C++
    Réponses: 16
    Dernier message: 07/09/2006, 23h18
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [COM] Libération mémoire
    Par MC2 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/01/2006, 16h15
  5. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo