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 cachée


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 15
    Par défaut Fuite mémoire cachée
    Bonjour à tous,

    Voilà mon problème :
    dans mon code (que je ne poste pas ici, il y a plusieurs milliers de lignes), j'ai une fonction de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (int readData(int i) {
        if(i>=0 && i <size) {
            return _data[i];
        }
        else {
           //message d'erreur
           return -1; 
        }
    }
    qui va lire une distance dans un tableau (int* _data). Les valeurs stocker dans _data vont de 0 à 300.

    A un endroit du code, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int distance = readData(index);
    //Affichage de la distance
    En temps normal, le code fonctionne parfaitement.
    J'ai voulu faire une modification, et dans une des structures utilisées par mon programme, j'ai rajouté un simple atribut de type int. (que je n'utilise jamais dans le code)
    Et là, gros plantage : la distance renvoyée par la fonction readData dépasse parfois 300 !

    J'imagine que le problème vient d'une fuite mémoire cachée quelque part dans le code, et qui altère la zone mémoire allouée au tableau _data. L'ajout de l'attribut a simplement mis en valeur cette fuite.

    2 questions :
    1. Est ce que j'ai raison de penser que le problème vient d'un autre endroit du code (j'ai vérifier l'allocation du tableau _data, et toutes les fonctions autour sans rien voir d'anormal)?
    2. Connaissez vous un outil (gratuit ci possible) qui permettrait de trouver cette fuite mémoire (un tableau non alloué, un dépassement de zone allouée, etc...) ? Sachant que pour l'instant j'utilise Visual 2003 (et que je ne sais pas vraiment utiliser le debugger)

    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Hello Nzeuwik,

    Tu pourrais nous montrer la déclaration, l'initialisation et l'affectation de valeurs pour _data? C'est peut-être là qu'il y a un problème.

    Des outils de vérification de la mémoire gratuits et bien pour Windows, je n'en connais malheureusement pas, donc je ne peux pas te répondre sur ce point-là.

    Carl

  3. #3
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Tu peux peut être essayer la version Trial de Rational Purify d'IBM qui est un outil conçu pour la détection de ce genre de problèmes.
    Personnellement je ne l'ai jamais utilisé, donc si toi tu l'utilise et qu'il résoud ton problème fait le savoir... ça peut toujours être intéressant.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut
    Pour vérifier les fuites mémoire, il y a un outil open source donc, totalement gratuit avec des IHM, c'est valgrind.

    Il y a aussi dmalloc mais cela t'obligeras à modifier meme tres légèrement ton code. (dmalloc comme "debug malloc")

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Déjà, tu peux changer le nom de ta variable qui n'est correcte. Il y a peut-être un conflit avec un define de ton compilateur, vu que les noms commançant par underscore lui sont réservés.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Corebreaker Voir le message
    Pour vérifier les fuites mémoire, il y a un outil open source donc, totalement gratuit avec des IHM, c'est valgrind.
    Valgrind existe sous Windows? C'est un bon outil, mais je crois qu'il n'existe que sous Linux pour l'instant.

    Carl

  7. #7
    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
    J'imagine que le problème vient d'une fuite mémoire cachée quelque part dans le code, et qui altère la zone mémoire allouée au tableau _data.
    Une fuite mémoire n'altère rien du tout.

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