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 :

[C++ Standard] Pourquoi ai je une fuite de mémoire ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Par défaut [C++ Standard] Pourquoi ai je une fuite de mémoire ?
    Bonjour à tous,
    j'ai une application qui ne fait pas de "new" en dehors de la période d'initialisation. A priori vu que je ne manipule que des données déjà existantes y a pas de raison que ma mémoire soit grignotée petit à petit.

    j'ai déjà vérifié, ce n'est pas un de mes vecteurs qui augmentent de taille.

    qu'est ce qui peut provoquer une fuite de mémoire ?
    je me souviens plus comment on fait pour connaître la mémoire alloué par le programme quand on a que la STL et posix a sa disposition...

    Vincent

  2. #2
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Bonjour,

    Peux-tu nous expliquer plus en détail ce que fait ton programme ?
    Une augmentation de la mémoire allouée ne signifie pas forcément une fuite mémoire. Cela peut provenir d'un buffer qui ne se vide pas, d'un empilage de données qui ne sont pas dépilées, …
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu n'appellerais pas des fonctions qui initialisent des handle sur des objets, et que tu oublies de libérer ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Bonjour,
    Peux-tu nous expliquer plus en détail ce que fait ton programme ?
    En gros c'est un moteur de physique, j'ai un monde virtuel dans lequel je peux rajouter des objets 3D, le monde virtuel detecte les collisions possible, les résouds etc...
    J'ai une boucle qui se lance au début de chaque frame dans l'ordre :
    - tri des objets (pour baisser le nb de paire)
    - detection des pairs
    - résolution des pairs en collision

    Citation Envoyé par Florian Goo Voir le message
    Une augmentation de la mémoire allouée ne signifie pas forcément une fuite mémoire. Cela peut provenir d'un buffer qui ne se vide pas, d'un empilage de données qui ne sont pas dépilées, …
    c'est quoi un empilage de données ?

    Tu n'appellerais pas des fonctions qui initialisent des handle sur des objets, et que tu oublies de libérer ?
    je n'utilise pas de handle, juste des pointeurs et des reférences c'est tout.
    dis m'en plus sur les handles, je connais pas trop... je suis un vieu je connais pas la programmation windows :p

    Vincent, je ne fait que du C++ Orienté Objet dans cette bibliothèque, avec la STL et un peu de POSIX (mais ca bug même sans creer de thread)... comprend pas. Qui peut me rappeler comment on fait pour avoir la quantité de menoire pris par le programme en C/C++ non windows ?

  5. #5
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Qui peut me rappeler comment on fait pour avoir la quantité de menoire pris par le programme en C/C++ non windows ?
    Non Windows ? C'est à dire que tu es sous Linux ?
    Sous Unix en général, il y a la commande top pour ça (avec l'option -p pour avoir un processus particulier). Mais je dois dire que je ne suis pas un spécialiste de la ligne de commande.

    Par empilage, je faisais référence à la pile système : http://fr.wikipedia.org/wiki/Allocation_de_mémoire

    Enfin, un handle, c'est un identifiant vers un objet alloué dynamiquement. C'est surtout utilisé en C. En C++, on subit ce genre de vieilleries quand on travaille directement avec l'API système (comme l'API Windows).

    Je dois reconnaitre que je ne sais pas quoi dire pour l'instant…
    Si j'étais à ta place, je réduirais mon code au fur et à mesure jusqu'à obtenir un exemple minimal, afin d'isoler le problème.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Non Windows ? C'est à dire que tu es sous Linux ?
    Je suis sous windows mais je fais du c++ standard, j'ai pas acces au API Windows...

    Citation Envoyé par Florian Goo Voir le message
    Par empilage, je faisais référence à la pile système
    a priori la pile se vide quand on quitte la fonction ou elle est utilisée.. je dois vérifier un truc quand même.

    Citation Envoyé par Florian Goo Voir le message
    Je dois reconnaitre que je ne sais pas quoi dire pour l'instant… Si j'étais à ta place, je réduirais mon code au fur et à mesure jusqu'à obtenir un exemple minimal, afin d'isoler le problème.
    C'est ce que je fais pour le moment ...

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Par défaut
    Bonjour,

    c'est quoi un empilage de données ?
    Vous devriez faire quelques recherches sur les structures de données. C'est très instructif et passionnant. Pour débuter je te conseil ceci : Structure de données.

    je n'utilise pas de handle, juste des pointeurs et des références c'est tout.
    Je penses que c'est les pointeurs qui font des fuites de mémoire il faudrait que vous adoptiez une stratégie de gestion de mémoire efficace. Cf voir Ceci.

    dis m'en plus sur les handles, je connais pas trop...
    Voilà je trouves que cette article sur Wikipédia explique cela assez bien ici.

    Qui peut me rappeler comment on fait pour avoir la quantité de menoire pris par le programme en C/C++ non windows ?
    Désolé je n'en c'est rien, il faudra attendre quelqu'un qui est plus spécialisé que moi sur ce sujet.

    A bientôt

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 113
    Par défaut
    Citation Envoyé par wakan Voir le message
    Pour débuter je te conseil ceci : Structure de données.
    heu, je crois pas qu'on parle de la même chose la.

    Citation Envoyé par wakan Voir le message
    Je penses que c'est les pointeurs qui font des fuites de mémoire il faudrait que vous adoptiez une stratégie de gestion de mémoire efficace. Cf voir Ceci.
    j'ai préciser dans mon post initial que je ne faisais de new qu'au debut du programme et qu'il n'y a aucun autre new par la suite. donc en terme de fuite de mémoire ça ne pouvait pas être ca.


    Citation Envoyé par wakan Voir le message
    Voilà je trouves que cette article sur Wikipédia explique cela assez bien ici.
    pareil... on parle pas de handle de fichier mais de handle de programme...

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Fraggy Voir le message
    j'ai préciser dans mon post initial que je ne faisais de new qu'au debut du programme et qu'il n'y a aucun autre new par la suite. donc en terme de fuite de mémoire ça ne pouvait pas être ca.
    Toi tu ne fait pas de new mais peut être qu'insidieusement, il y a des new qui sont faits ailleurs dans le code (un vector ou une list qui grandit).

    Ce que tu peux faire si tu maitrise le code de l'application c'est de surcharger le new et le delete global et ainsi de tracer les appels avec les taille allouées. Cela ne marche que pour new et delete, pour les malloc et free, faudra trouver autre chose. Je ne sais pas si Valgrind ne sait pas faire de la détection de fuite mémoire.

    Dans le livre Penser en C++ traduit par l'équipe, il y a un exemple pour surcharger le new et le delete global (chapitre 13.5.1)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. Une fuite de mémoire ?
    Par 304bl dans le forum Général Java
    Réponses: 8
    Dernier message: 30/03/2013, 08h28
  2. Réponses: 7
    Dernier message: 20/12/2009, 18h42
  3. Réponses: 2
    Dernier message: 26/10/2005, 11h44
  4. Réponses: 12
    Dernier message: 14/07/2005, 16h55
  5. Réponses: 9
    Dernier message: 31/05/2005, 10h05

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