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 :

Fuites de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut Fuites de mémoire
    Bonjour,
    je viens de reprendre le développement du pacman. Et je m'étais déjà rendu compte que j'avais une/des fuite(s) de mémoire. On m'a conseillé d'utiliser valgrind sur Ubuntu, mais j'ai du mal à bien interpréter les résultats. Auriez-vous un explicatif assez complet quelque part,...?

    Autrement, j'utilise beaucoup de structures, mais je me demande si je les utilise bien. Je passe en paramètre les adresses des structures, mais faut-il jouer avec malloc (ce que je ne fais pas pour le moment).

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct joueur pacman; 
    //remplissage de la structure du genre pacman.nbVies = 3;
    deplacerJoueur(&pacman); 
     
    //dans deplacerJoueur(struct joueur *pacman)
    pacman->nbVies--;
    Faut-il que je fasse comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct joueur *pacman; 
    pacman = malloc(sizeof(struct joueur));
    //remplissage de la structure du genre pacman->nbVies = 3;
    deplacerJoueur(pacman); 
     
    //dans deplacerJoueur(struct joueur *pacman)
    pacman->nbVies--;
    L'avantage de la deuxième méthode, c'est que je peux faire free(pacman); Mais je pense utiliser toujours les mêmes éléments. Ca pourrait expliquer une fuite de mémoire, mais je ne suis pas sûr. Je préfère me référer à vous avant d'effectuer les changements.

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    Bien le bonsoir,

    Pour ce qui est de Valgrind, tu as de la doc sur wikipedia, ça peut être un début.

    Le choix structures dynamiques/statiques va dépendre de l'usage que tu fais de tes structures, si le nombre de ces variables est toujours le même, si tu souhaites en gérer finement la mémoire.

    Personnellement, je conseillerais d'utiliser une version dynamique, ça permettrait de se rapprocher d'une programmation objet en créant des constructeurs et destructeurs, qui appellent eux-mêmes les malloc et les free.

    Une petite chose, dans la version statique, l'accès aux champs d'une structure se fait avec un . et non ->
    De plus, dans la méthode statique, si jamais la structure joueur contient des champs dynamiques, il faudra aussi penser à les libérer explicitement.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Si tu débute avec valgrind, cela peut peut-etre t aider :
    http://www.info.fundp.ac.be/~hto/enc...troduction.pdf
    Pour ce qui est version statique et dynamique, cela depend surtout de sa duree de vie.

  4. #4
    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
    je ne sais pas si ddd existe sur Ubuntu, mais c'est ce que j'utilise.

    Quand à ta question de départ, aucune importance, ce n'est certainement pas de là que je viens l'erreur.

    Par contre, sans en savoir plus sur le code, impossible d'en dire plus...

  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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par souviron34
    je ne sais pas si ddd existe sur Ubuntu, mais c'est ce que j'utilise.
    Bin disons qu'il existe sur Linux tout simplement, il suffit au pire des cas de l'installer
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Je peux vous montrer le code si vous voulez mais ça fait plus de 1000lignes... J'ai pas tellement envie de vous imposer ça.

    Il y a deux sources de fuite possibles: les structures et l'utilisation de SDL. Mais la fuite est assez colossale en utilisation de mémoire, ça passe de quelques Ko à plusieurs dizaines de Mo. L'augmentation est continue, j'en déduis que ça vient forcément d'une boucle.

    Je vais jeter un oeil à ddd.

    Autrement valgrind ne me dit pas ou se trouve les fuites dans mon code mais il me signale des erreurs dans les fichiers sources de SDL. Je vous copierai une partie du rendu au soir (mon code est resté chez moi).

  7. #7
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Voici comme je vous disais une partie du valgrind qui ne m'aide pas des masses:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    ==6922== Invalid read of size 4
    ==6922==    at 0x4014770: (within /lib/ld-2.5.so)
    ==6922==    by 0x4005B69: (within /lib/ld-2.5.so)
    ==6922==    by 0x4007995: (within /lib/ld-2.5.so)
    ==6922==    by 0x4010D94: (within /lib/ld-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x40108ED: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B7C2C: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B82AB: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x43B7B63: dlopen (in /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x408EB9C: SDL_LoadObject (in /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x40953AE: (within /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==  Address 0x47C6508 is 24 bytes inside a block of size 25 alloc'd
    ==6922==    at 0x4021620: malloc (vg_replace_malloc.c:149)
    ==6922==    by 0x4007F33: (within /lib/ld-2.5.so)
    ==6922==    by 0x4010D94: (within /lib/ld-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x40108ED: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B7C2C: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B82AB: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x43B7B63: dlopen (in /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x408EB9C: SDL_LoadObject (in /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x40953AE: (within /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x409E8CB: (within /usr/lib/libSDL-1.2.so.0.11.0)
    --6922-- Reading syms from /usr/lib/libXrender.so.1.3.0 (0x48D4000)
    --6922-- Reading debug info from /usr/lib/libXrender.so.1.3.0...
    --6922-- ... CRC mismatch (computed A206CFC4 wanted EEB9A1A6)
    --6922--    object doesn't have a symbol table
    --6922-- Reading syms from /usr/lib/libXrandr.so.2.1.0 (0x48DC000)
    --6922-- Reading debug info from /usr/lib/libXrandr.so.2.1.0...
    --6922-- ... CRC mismatch (computed 1D2EC385 wanted D95A4DEC)
    --6922--    object doesn't have a symbol table
    --6922-- REDIR: 0x4158DA0 (free) redirected to 0x40211B5 (free)
    --6922-- REDIR: 0x415BDF0 (strncmp) redirected to 0x40224E0 (strncmp)
    --6922-- REDIR: 0x415D030 (stpcpy) redirected to 0x4022B10 (stpcpy)
    --6922-- REDIR: 0x4158F90 (realloc) redirected to 0x402164A (realloc)
    ==6922== 
    ==6922== Invalid read of size 4
    ==6922==    at 0x4014759: (within /lib/ld-2.5.so)
    ==6922==    by 0x400D2A9: (within /lib/ld-2.5.so)
    ==6922==    by 0x4009812: (within /lib/ld-2.5.so)
    ==6922==    by 0x41F33D2: (within /lib/tls/i686/cmov/libc-2.5.so)
    ==6922==    by 0x41F3639: _dl_sym (in /lib/tls/i686/cmov/libc-2.5.so)
    ==6922==    by 0x43B7DE7: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B82AB: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x43B7D72: dlsym (in /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x408EADA: SDL_LoadFunction (in /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x4094D6C: (within /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x4095E97: (within /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==  Address 0x47C60EC is 20 bytes inside a block of size 22 alloc'd
    ==6922==    at 0x4021620: malloc (vg_replace_malloc.c:149)
    ==6922==    by 0x4007F33: (within /lib/ld-2.5.so)
    ==6922==    by 0x4010D94: (within /lib/ld-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x40108ED: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B7C2C: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x400CFA5: (within /lib/ld-2.5.so)
    ==6922==    by 0x43B82AB: (within /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x43B7B63: dlopen (in /lib/tls/i686/cmov/libdl-2.5.so)
    ==6922==    by 0x408EB9C: SDL_LoadObject (in /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x40953AE: (within /usr/lib/libSDL-1.2.so.0.11.0)
    ==6922==    by 0x409E8CB: (within /usr/lib/libSDL-1.2.so.0.11.0)
    Il parle de tout sauf de mes fichiers sources.

    Passons à ddd, voici ce qu'il me retourne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread -1216284992 (LWP 7163)]
    0xb7f819ec in TTF_SizeUNICODE () from /usr/lib/libSDL_ttf-2.0.so.0
    Il s'arrête là et ne vas pas plus loin... Il a à peine ouvert ma fenêtre mais pas chargé mon interface graphique,... Juste pour préciser, je ne fais pas d'appel à TTF_SizeUNICODE mais à TTF_Init (), TTF_OpenFont (), TTF_RenderText_Blended() et TTF_CloseFont()

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 16h19
  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