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 :

fuite de mémoire ?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut fuite de mémoire ?
    Bonjour, j'aimerais savoir si mon code suivant engendre une fuite de mémoire. Par exemple, je fais la fonction suivante :

    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
    17
    18
     
    int * ma_fun(int i1,int i2)
    {
    int * tab=malloc(2*sizeof(*tab));
    tab[0]=i1;
    tab[1]=i2;
     
    return tab;
    }
     
    int main()
    {
    int * toto=ma_fun(3,5);
    printf("%d\t%d\n",toto[0],toto[1]);
     
    free(toto);
    return 0;
    }
    Alors je pense qu'il doit y avoir une fuite de mémoire car ma fonction ma_fun renvoie (si j'ai bien compris) une copie de l'adresse de tab. Ce qui fait qu'il y a deux pointeurs : tab et toto. Pourtant, je n'ai qu'un seul malloc et un seul free.

    Est-ce que je me trompe ?

    Merci.

  2. #2
    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 Re: fuite de mémoire ?
    Citation Envoyé par salseropom
    Bonjour, j'aimerais savoir si mon code suivant engendre une fuite de mémoire.
    Non.
    Par exemple, je fais la fonction suivante :
    <...>
    Alors je pense qu'il doit y avoir une fuite de mémoire car ma fonction ma_fun renvoie (si j'ai bien compris) une copie de l'adresse de tab. Ce qui fait qu'il y a deux pointeurs : tab et toto. Pourtant, je n'ai qu'un seul malloc et un seul free.

    Est-ce que je me trompe ?
    Oui. Malgré ce qu'on lit souvent, ce n'est pas un pointeur que malloc() /free() alloue/libère, mais un bloc mémoire. Le pointeur ne sert qu'à stocker l'adresse de ce bloc mémoire (et accessoirement à y accéder)..

    Ici, malloc() alloue un bloc dont l'adresse est stockée dans tab. La valeur de tab est retournée à l'appelant qui à son tour la sauvegarde dans toto. Ensuite, le free() libère le bloc pointé par toto.

    A part que tu ne testes pas le retour de malloc() , ce code est correct.

    Il est de bon ton, une fois qu'un bloc a été libéré, de remettre à NULL le ou les pointeurs qui contenaient l'adresse de ce bloc.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    merci. Ouf ça me rassure, car sinon j'aurais du modifier bcp de fonctions de mon prgm.
    Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/01/2006, 10h52
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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