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 :

contrôler les fuites mémoire


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut contrôler les fuites mémoire
    Bonjour,

    Je suis sous linux / g++ / gdb

    J'ai terminé mon programme, en libérant soigneusement la mémoire dans mes destructeurs ...

    Cependant j'ai des oublis et des fuites mémoire importantes ici ou là et j'aimerais contrôler tout ça méthodiquement !

    J'ai aussi des déclarations de variables ou d'objets inutiles qui doivent trainer un peu partout. Voilà j'aimerais contrôler tout ça avec des outils ou des méthodes. Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Pour tes fuites mémoire, tu peux utiliser valgrind

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour les variables inutilisées, rajouté les options
    -Wall -Wextra
    à la compilation sera bénéfique
    (Surtout le -Wextra qui rapport les variables inutilisées)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut merci
    Merci, on m'en avait parlé et j'avais oublié cet outil, je vais bosser avec valgrind maintenant. C'est exactement ce que je cherchais.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    dans le genre intéressant à voir pour la technique, tu peux aussi surcharger les opérateurs new et delete (new[] et delete[]), afin de faire un suivi des (dés)allocations.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut ha oui
    Ha oui, c'est vrai, j'avais entendu parler de cette technique. Merci

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Avec une bonne dose de RAII, tu n'as normalement aucune fuite de mémoire.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Avec une bonne dose de RAII, tu n'as normalement aucune fuite de mémoire.
    Avec une bonne dose de code parfait, tu n'as normalement aucun bug.

    Le RAII est effectivement une bonne méthode à appliquer en C++, mais cela n'empêche pas de faire des erreurs (qui peuvent se traduire par des fuites). Seuls des outils comme Valgrind permettent de valider une bonne gestion de la mémoire.
    Find me on github

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 64
    Points : 40
    Points
    40
    Par défaut RAII
    Pour la question du RAII :

    Mes problèmes de codage propre :

    J'utilise une bibliothèque destinée au C dans mes classes. Donc je me trimbale pas mal de pointeurs ici ou là.

    J'ai des objets qui prennent beaucoup de mémoire vive. Donc je libère genre 40% de l'objet en cour de route et le reste dans mon del_datas.cpp

    Sinon à coup de valgrin et de gdb / meminfo j'ai libéré beaucoup de mémoire.

    Cependant j'ai encore 80 Mégas sur un total de 200 Mégas qui ne sont pas libérés juste avant mon exit(0)

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Il te faudrait une classe wrapper pour gérer les alloc/désalloc de ta lib C selon le principe RAII. Cf cet article Wikipédia : http://en.wikipedia.org/wiki/Wrapper_library#Example

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Je sais que dans ton cas c'est un peu tard mais pour ma part j'utilise le design pattern smart pointer cela permet de mettre en place une dés-allocation dynamique et un peu plus sur.

    Juste comme ça pour tes futurs projets

    Bonne journée

  12. #12
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Points : 1 361
    Points
    1 361
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour,

    dans le genre intéressant à voir pour la technique, tu peux aussi surcharger les opérateurs new et delete (new[] et delete[]), afin de faire un suivi des (dés)allocations.
    Une variable statique qui compte le nombre d'allocations et de désallocations mise à jour dans chaque new et delete, c'est trop violent? Ou c'est à çà que tu pensais?
    les raisonnables ont duré, les passionné-e-s ont vécu

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par rmaker Voir le message
    Une variable statique qui compte le nombre d'allocations et de désallocations mise à jour dans chaque new et delete, c'est trop violent? Ou c'est à çà que tu pensais?
    Pour faire un test qui reste côté dev et qui n'est pas livré, pourquoi pas, mais ça risque de ne pas beaucoup t'aider à trouver quel objet n'a pas été delete. Un compteur unique pour tous les objets n'est pas une info très intéressante, tu vas te retrouver avec un compteur énorme qui a peu de sens.
    Find me on github

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Pour faire un code sans problème de fuite mémoire:

    - ne jamais faire de new et donc de delete ( donc ne pas utiliser de pointeurs)
    - si vraiment on doit utiliser des pointeurs:

    - ne pas utiliser de pointeurs
    - si on est pas sûr, utiliser des références
    - si on est vraiment sûr de savoir pourquoi on utilise un pointeur:

    - utiliser un pointeur intelligent comme le shared_ptr ( comme dans boost::shared_ptr ou tr1::shared_ptr ou en standard dans C++11 )

    Du coup, normalement tu ne devrais jamais écrire "delete".

  15. #15
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    - ne jamais faire de new et donc de delete ( donc ne pas utiliser de pointeurs)
    .
    Il ne faut pas confondre l'usage de pointeurs et l'allocation dynamique. Il est rare de pouvoir écrire un programme complet sans allocation dynamique. Quant à se passer de pointeurs, n'y pensez même pas : même si vous écrivez votre code sans pointeurs et sans allocations dynamiques, il y a peu de chances que vous trouviez des bibliothèques qui n'en utilisent pas.

    Citation Envoyé par nikko34 Voir le message
    - utiliser un pointeur intelligent comme le shared_ptr ( comme dans boost::shared_ptr ou tr1::shared_ptr ou en standard dans C++11 )
    Attention aux smart pointers, qui représentent une solution de facilité dans beaucoup de cas mais qui doivent être utilisés avec intelligence et en compagnie des std::weak_ptr, des std::uniq_ptr (C++11) et des pointeurs nus. Voici un article qui traite du sujet.
    Find me on github

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Je te l'accorde, c'est une simplification.

    Le problème des fuites mémoires en C++, et je ne pense pas que ça ait beaucoup changé en quelques années, a toujours été un usage abusif des pointeurs qui entraine des fuites mémoires, souvent par inadvertance (oubli d'un delete, exception malencontreuse).

    La première règle est donc de n'utiliser des pointeurs seulement quand ils sont nécessaires. Et donc de savoir en quoi ils sont nécessaires en C++.

    De la même façon, cette règle inclus aussi le fait de n'utiliser les pointeurs intelligents que quand ils sont nécessaire. std::unique_ptr (C++11) fait parti des pointeurs intelligents.

    Un abus de pointeurs intelligents n'est finalement qu'un abus de pointeurs tout court.

    En C++, où il est extrèmement important de savoir qui a la responsabilité de quoi ( en gros, quel objet décide de la durée de vie des autres objets ), il y a des cas où on est obligé tout de même d'utiliser des pointeurs. Et dans ces cas là, bien sûr, je ne me vois pas conseiller autre chose que d'utiliser des pointeurs intelligents ( donc, shared_ptr est un pointeur intelligent mais aussi unique_ptr si on peut, scoped_ptr, weak_ptr etc.. ).

    Dans ce cas là, je préfère voir beaucoup de shared_ptr plutôt que des pointeurs nus, même si bien sûr il faudrait avoir plutôt des unique_ptr (ou boost::scoped_ptr) etc.. Déjà si on utilise plus de pointeurs quand c'est inutile et qu'on se protège avec des pointeurs intelligents (même si ce sont des shared_ptr inutiles dans beaucoup de cas), on devrait ne pas avoir de fuites mémoires.

Discussions similaires

  1. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  2. Réponses: 5
    Dernier message: 07/04/2008, 16h36
  3. Detecter les fuites mémoire
    Par tazer dans le forum Visual C++
    Réponses: 6
    Dernier message: 29/02/2008, 14h26
  4. [AJAX] Que faire contre les fuites mémoires (memory leaks)
    Par cassy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/08/2007, 16h50
  5. Traquer les fuites mémoires (memoryLeak) ?
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 08/09/2005, 09h07

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