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 :

questions sur la gestion de la mémoire


Sujet :

C

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut questions sur la gestion de la mémoire
    Bonjour,

    J'ai deux questions concernant les allocations et désallocations mémoire :

    1- que se passe-t-il si l'on fait plusieurs "malloc" sur un même pointeur?
    2- lorsqu'on fait "free(ptr)", ptr est-il positionné à NULL?

    Merci d'avance pour vos réponses

  2. #2
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par agnesN7 Voir le message
    1- que se passe-t-il si l'on fait plusieurs "malloc" sur un même pointeur?
    On perd les adresses fournies par les malloc precedent. Si ces adresse n'ont pas ete sauvegardees, les zones memoires alloues par les differents malloc ne sont plus accessibles et ne peuvent donc pas etre liberees. Tu as alors une fuite memoire.

    Citation Envoyé par agnesN7 Voir le message
    2- lorsqu'on fait "free(ptr)", ptr est-il positionné à NULL?
    Non, c'est pour ca qu'il est frequent de voir dans des codes sources "free(ptr); ptr=NULL;" voire une macro qui realise cela.

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par agnesN7 Voir le message
    1- que se passe-t-il si l'on fait plusieurs "malloc" sur un même pointeur?
    Petit probleme de vocabulaire ici. On ne malloc() pas sur un pointeur, mais l'adresse d'un segment de memoire alloue est stockee dans un pointeur. Dit comme cela, il t'est facile de repondre a la question: l'adresse stockee precedemment est ecrasee par la nouvelle adresse. Cela peut avoir pour consequence ne plus pouvoir acceder au bloc alloue precedemment, notamment pour le liberer (fuite memoire).

    2- lorsqu'on fait "free(ptr)", ptr est-il positionné à NULL?
    Comment veux-tu que free() modifie l'adresse contenue dans ptr, alors qu'elle ne recoit pas un pointeur vers ptr?

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Merci à vous pour vos réponses, je comprends mieux comment la mémoire est gérée maintenant

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Points : 380
    Points
    380
    Par défaut
    Citation Envoyé par gl Voir le message
    Non, c'est pour ca qu'il est frequent de voir dans des codes sources "free(ptr); ptr=NULL;" voire une macro qui realise cela.
    Petite rectification, en général on écrit ceci : free(ptr), ptr = NULL; (une virgule et non pas un point-virgule entre les deux, ça permet de bien spécifier que les deux instructions sont exécutées l'une à la suite de l'autre).

  6. #6
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    Petite rectification, en général on écrit ceci : free(ptr), ptr = NULL;
    L'utilisation de la virgule, dont je vois tout a fait l'interet, n'est pas si frequente que ca (de ce que je vois regulierement j'aurais meme tendance a dire que c'est annecdoctique).

    Mais tu as tout a fait de raison de preciser l'existence de cette notation qui est une forme "alternative" de celle que j'ai citee et qui presente l'avantage de bien faire ressortir le lien entre les deux operations.

  7. #7
    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 agnesN7 Voir le message
    1- que se passe-t-il si l'on fait plusieurs "malloc" sur un même pointeur?
    On fait pas de malloc() "sur un pointeur".

    On appelle malloc() et on stocke la valeur retournée (l'adresse du bloc alloué), parce qu'on en a besoin pour la suite. Le bon sens et la logique veulent que l'on stocke cette valeur (une adresse, donc) dans un pointeur, qui par un heureux concours de circonstances (!) est précisément une variable destinée à stocker une adresse. Incroyable, non ?

    Tout ceci pour dire qu'il faut se méfier des raccourcis douteux et bien rester conscient de la réalité des faits... (attitude souhaitable dans bien des cas, même hors de l'informatique...)

    2- lorsqu'on fait "free(ptr)", ptr est-il positionné à NULL?
    Bah, il suffit de regarder le prototype de free() pour constater que non, car l'interface ne le permet pas...

    Je recommande cet usage :

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Je ne savais pas que la synthaxe "instruction1,instruction2;" était correcte. J'en prends note

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Points : 44
    Points
    44
    Par défaut
    J'avais une question à propos de free(ptr). Donc free() n'associe pas NULL à ptr, donc ptr reste pointer vers ce bout de mémoire libéré?

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par pongping Voir le message
    J'avais une question à propos de free(ptr). Donc free() n'associe pas NULL à ptr, donc ptr reste pointer vers ce bout de mémoire libéré?
    Oui! Mais l'adresse stockée dans la variable ptr est désormais invalide. Affecter la valeur NULL à ptr permet alors d'expliciter (par une valeur testable) le fait que ptr ne contient pas une adresse valide.

    Thierry

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

Discussions similaires

  1. [SuSE] questions sur la gestion mémoire
    Par jhfra dans le forum Linux
    Réponses: 2
    Dernier message: 02/12/2013, 11h39
  2. Questions sur la gestion de la mémoire
    Par Graimbault dans le forum Administration système
    Réponses: 0
    Dernier message: 20/04/2012, 15h48
  3. Question sur la gestion de la mémoire
    Par angelocoupet dans le forum Linux
    Réponses: 2
    Dernier message: 03/01/2011, 18h43
  4. Question sur la gestion mémoire
    Par rem02 dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2007, 22h06
  5. Question sur la gestion des fenetres MDI
    Par RémiONERA dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/07/2005, 07h58

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