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 mémoire?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut fuite mémoire?
    Bonjour,

    J'ai envie de vérifier si un de mes programme comporte des fuites mémoire. J'ai donc installé valgrind (3.0.1), pour tester cela. Avant de tester mon programme, je comptais "tester" valgrind, en créant un petit programme contenant une belle fuite mémoire, histoire de voir ce qu'il allait me donner. Le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using namespace std;
     
    int main (int argc, char* argv[])
    {
    	int *x = new int[10];
    	x[1]=5;
    	return 0;
    }

    N'ayant pas désalloué mon pointeur, je pensais avoir créé ma fuite. Mais voici ce que me rapporte valgrind :

    ==16761== Memcheck, a memory error detector.
    ==16761== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
    ==16761== Using LibVEX rev 1367, a library for dynamic binary translation.
    ==16761== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
    ==16761== Using valgrind-3.0.1, a dynamic binary instrumentation framework.
    ==16761== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
    ==16761== For more details, rerun with: -v
    ==16761==
    ==16761== Conditional jump or move depends on uninitialised value(s)
    ==16761== at 0x119106B1: (within /lib/ld-2.3.5.so)
    ==16761== by 0x11904454: (within /lib/ld-2.3.5.so)
    ==16761== by 0x11904A9C: (within /lib/ld-2.3.5.so)
    ==16761== by 0x11902360: (within /lib/ld-2.3.5.so)
    ==16761== by 0x1190EB6F: (within /lib/ld-2.3.5.so)
    ==16761== by 0x119014ED: (within /lib/ld-2.3.5.so)
    ==16761== by 0x11900A37: (within /lib/ld-2.3.5.so)
    (autres erreurs comme celle-ci, venant de libc)
    ==16761==
    ==16761== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)
    ==16761== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==16761== malloc/free: 30 allocs, 30 frees, 3681 bytes allocated.
    ==16761== For counts of detected errors, rerun with: -v
    ==16761== No malloc'd blocks -- no leaks are possible.
    Visiblement, il trouve qu'il n'y a pas de fuite mémoire... Est-ce vrai?

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    D'après ses commentaires, il ne comptabilise que les malloc/free ????

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Normalement, il est sencé être plus complet que ca :

    * Use of uninitialised memory
    * Reading/writing memory after it has been free'd
    * Reading/writing off the end of malloc'd blocks
    * Reading/writing inappropriate areas on the stack
    * Memory leaks -- where pointers to malloc'd blocks are lost forever
    * Passing of uninitialised and/or unaddressible memory to system calls
    * Mismatched use of malloc/new/new [] vs free/delete/delete []
    * Overlapping src and dst pointers in memcpy() and related functions
    * Some misuses of the POSIX pthreads API
    Mais bon, ne l'ayant jamais utilisé, il est possible qu'il en fasse moins que ce que je pensais, ou que je l'utilise mal :S

    Sinon, quelqu'un connaitrait-il un moyen de détecter les fuites mémoires sous Linux?

  4. #4
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    as tu essayer en activant la verification des fuites mémoires ?
    ex:
    % valgrind -v --leak-check=yes ./sample1

    où sample1 est le program a vérifer

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Oui oui, c'est même ce que j'ai fait (désolé, j'ai oublié de marquer la ligne saisie, j'en profite pour remettre le résultat, maintenant que je n'ai plus les erreurs dues à libc ) :

    $valgrind --leak-check=yes test
    ==8622== Memcheck, a memory error detector.
    ==8622== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
    ==8622== Using LibVEX rev 1367, a library for dynamic binary translation.
    ==8622== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
    ==8622== Using valgrind-3.0.1, a dynamic binary instrumentation framework.
    ==8622== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
    ==8622== For more details, rerun with: -v
    ==8622==
    ==8622==
    ==8622== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 5)
    ==8622== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==8622== malloc/free: 30 allocs, 30 frees, 3681 bytes allocated.
    ==8622== For counts of detected errors, rerun with: -v
    ==8622== No malloc'd blocks -- no leaks are possible.

  6. #6
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Personne n'a d'idée?

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est louche.. Voici ce que valgrind me sort ici pour le meme programme que toi:

    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
    ==20032== Memcheck, a memory error detector for x86-linux.
    ==20032== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
    ==20032== Using valgrind-2.4.0, a program supervision framework for x86-linux.
    ==20032== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
    ==20032== For more details, rerun with: -v
    ==20032== 
    ==20032== 
    ==20032== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 1)
    ==20032== malloc/free: in use at exit: 40 bytes in 1 blocks.
    ==20032== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
    ==20032== For counts of detected errors, rerun with: -v
    ==20032== searching for pointers to 1 not-freed blocks.
    ==20032== checked 110592 bytes.
    ==20032== 
    ==20032== LEAK SUMMARY:
    ==20032==    definitely lost: 40 bytes in 1 blocks.
    ==20032==      possibly lost: 0 bytes in 0 blocks.
    ==20032==    still reachable: 0 bytes in 0 blocks.
    ==20032==         suppressed: 0 bytes in 0 blocks.
    ==20032== Use --leak-check=full to see details of leaked memory.
    Je suspecte que tu teste pas le bon programme... Pourquoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ==16761== malloc/free: 30 allocs, 30 frees, 3681 bytes allocated.
    Tu teste un programme faisant 30 alloc/free. Ce n'est pas le programme que tu nous a mit lors de ton premier post c'est certain.

    Pour info, je me suis contente de le runner avec la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valgrind ./valgrind-test
    Juste un guess: Tu n'aurais pas par hazard donne un nom a ton executable qui correspond a celui deja present sur ton systeme, et qu'ensuite tu as oublie le "./" pour specifier le bon executable?

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    int *x = new int[10];
    un int fait 4 bytes a priori, donc tu alloues 40 bytes.
    D'après ton truc tu en alloues 30 et tu en libères 30. Y'a un problème.

  9. #9
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Oui, je crois avoir trouvé le problème:

    J'utilisais la commande "valgrind test" et pas "valgrind ./test"... ce qui expliquait le problème :S

    Merci à tous de votre aide, même si mon erreur était bête, je ne pense pas que je l'aurais trouvé

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

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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