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 :

désallocation de mémoire


Sujet :

C

  1. #1
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut désallocation de mémoire
    Bonjour,
    tout d'abord je ne sais pas si ma question porte plus sur C ou sur Linux donc mes chers modérateurs déplacez le si nécessaire.

    J'ai voulu tester ce qui se passe si je ne désaloue pas la mémoire dans un programme C. J'ai fait une boucle avec un malloc à l'interrieur mais pas de free. Si j''exécute le programme, ma mémoire vive explose bien évidemment. Cependant j'ai remarqué que lorsque j'arrête le programme (Ctrl-C) la quantité de ma ram libre redevient exactement la même qu'avant l'exécution.

    Quelqu'un pourrait-il m'expliquer ?

    merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Quand un processus s'arrête le système récupère toute la mémoire allouée, il n'y a donc pas de fuite mémoire 'en dehors'...
    (quelque part c'est rassurant )

    Ceci fait dire à certains qu'allouer quelque chose à la création et ne pas le désallouer en sortie n'est pas grave puisque le système s'en chargera.
    (personnellement je préfère tout désallouer, ce n'est en général pas très compliqué de toute façon)

    MAT.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Mat a raison.
    Toutefois, il est bien de désallouer la mémoire :
    - je pense que c'est une très bonne habitude de programmation.
    - Si tu as un programme un peu conséquent ou si tu veux aller bosser dans une entreprise, il faut désallouer.

  4. #4
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    ok merci pour les précisions.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    J'ajouterais que le comportement dépend surtout de l'implémentation système, sous Linux je sais que le noyau libère les ressources mais sur d'autres systèmes que je ne citerais pas (sans les dénigrer) c'est pas aussi sûr que ca à ce que j'ai une fois crû comprendre

    Le mieux reste encore de libérer la mémoire soi même et c'est d'ailleurs recommandé pour le check des memory leak avec Valgrind (sous Linux) par exemple !

  6. #6
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par Franck.H
    Le mieux reste encore de libérer la mémoire soi même !
    évidemment.

    Je vais voir Valgrid ça a l'air sympa.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Quelle que soit la manière dont on quitte un processus, les S.E. libèrent les ressources associées à ce processus. Même DOS le faisait. Ce qui pose problème, ce sont les ressources qui ne sont pas associées à un processus particulier (mémoire partagée, j'ai cru comprendre que de la mémoire allouée par une DLL sous Windows pouvait se trouver dans ce cas, suivant les S.E. il peut y avoir d'autres choses). Passer son temps à tout libérer quand on quitte le programme, ça fait peut-être propre mais je me demande toujours ce que peuvent bien faire certains programmes qui mettent 10 minutes quand on veut les quitter. Une chose qu'il est possible de faire, c'est de rendre la libération conditionnelle avec le préprocesseur ou une variable d'environnement: on peut faire les tests et vérifier qu'on a bien connaissance de tout ce qui est alloué (bien souvent, ce qu'on ignore aurait dû l'être bien avant), mais on ne frustre pas l'utilisateur en prenant du temps pour ne rien faire d'utile.

  8. #8
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Tex-Twil
    J'ai fait une boucle avec un malloc à l'interrieur mais pas de free. Si j''exécute le programme, ma mémoire vive explose bien évidemment.
    Etrange, à moins que tu n'accèdes effectivement à l'espace alloué... normalement, "allouer de la mémoire" ne veut pas dire "réserver un espace en mémoire physique" : Linux ne "réserve", normalement, la mémoire que si on y accède (par le biais d'une écriture ou d'une lecture, par exemple). Quand on alloue de la mémoire, rien ne garantit qu'il existe effectivement une ou plusieurs pages mémoire reférençant cette espace alloué.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Etrange, à moins que tu n'accèdes effectivement à l'espace alloué... normalement, "allouer de la mémoire" ne veut pas dire "réserver un espace en mémoire physique" :
    Pas toujours, mais déjà quand on arrive au bout de la mémoire virtuelle, il y a une erreur.

    Linux ne "réserve", normalement, la mémoire que si on y accède (par le biais d'une écriture ou d'une lecture, par exemple).
    C'est un peu plus compliqué que cela. L'overcommit est contrôlé par d'au moins deux manières: /proc/sys/vm/overcommit_memory et /proc/sys/vm/overcommit_ratio. Chez moi le premier est à 0 (et je ne me souviens pas avoir fait quelque chose pour cela, mais ce n'est pas impossible que je me trompe), donc il n'y en a pas du tout. Le deuxième "fichier" à voir son nom doit limiter la quantité qu'on peut dépasser. Donc l'allocation peut échouer aussi à cause de cela. (Je trouve stupide que ce contrôle soit global pour le système: pour moi ça devrait être par process).

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Quelle que soit la manière dont on quitte un processus, les S.E. libèrent les ressources associées à ce processus. Même DOS le faisait.
    En sortant par exit() ou un return du main(), oui. J'ai par contre des souvenirs de gamelles mémorables avec Borland C 3.1 après des sorties à la barbare sur un assert().

    A la première recompilation : système planté avec "Not enough memory" -> reboot...

    Pas tellement sous DOS véritable (6.22) ni WIndows 3.x, mais plutôt sous Machine Virtuelle DOS de Windows 98.

    Y'a encore des bits collés sur les murs de mon ancien bureau...

  11. #11
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Pas toujours, mais déjà quand on arrive au bout de la mémoire virtuelle, il y a une erreur.
    Certes, on est d'accord.

    D'ailleurs, un bon moyen de faire planter un système du style Linux, c'est de vérouiller brutalement toutes les pages accessibles depuis le processus (c'est la fonction mlock je crois, ou quelque chose dans ce style-là).

    Il faudrait essayer, juste pour voir et se marrer un bon coup !

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    En sortant par exit() ou un return du main(), oui. J'ai par contre des souvenirs de gamelles mémorables avec Borland C 3.1 après des sorties à la barbare sur un assert().

    A la première recompilation : système planté avec "Not enough memory" -> reboot...

    Pas tellement sous DOS véritable (6.22) ni WIndows 3.x, mais plutôt sous Machine Virtuelle DOS de Windows 98.
    Je trouve ça bizarre, ça ne correspond pas tellement à mon souvenir de programmation sous DOS, mais il est vrai que je me suis arrêté à Windows 3.1 (et encore, j'ai pas tellement programmé avec Windows à l'époque). D'après mes souvenirs, les reboot après crash était dus à de la corruption des structures de donnée internes de DOS.

    Je suis passé à Linux dès fin 1994 pour mon utilisation personnelle -- mon utilisation professionnelle étant alors sous SunOS, Ultrix et accessoirement VMS -- n'utilisant plus Windows que pour les jeux.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Je trouve ça bizarre, ça ne correspond pas tellement à mon souvenir de programmation sous DOS, mais il est vrai que je me suis arrêté à Windows 3.1
    assert() sort par abort() (ou _abort()) au lieu de exit(). C'est probablement la raison. Depuis que j'ai réécris la fonction de sortie appelée par assert() avec exit(), je n'ai plus jamais eu ce problème.

    http://emmanuel-delahaye.developpez....d/inc/assert.h
    http://emmanuel-delahaye.developpez....d/src/assert.c

Discussions similaires

  1. Problème de désallocation de mémoire
    Par ratan dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2011, 17h20
  2. Erreur de désallocation de mémoire
    Par ZAYDOUN dans le forum OpenCV
    Réponses: 10
    Dernier message: 05/08/2008, 16h27
  3. allocation/désallocation de mémoire
    Par kinta dans le forum C++
    Réponses: 2
    Dernier message: 10/02/2006, 09h52
  4. Désallocation mémoire des types record
    Par mounis dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 13h21
  5. Désallocation de mémoire ...
    Par Mike888 dans le forum C
    Réponses: 9
    Dernier message: 18/01/2006, 10h42

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