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

Langage C++ Discussion :

Fuite de mémoire en utilisant le template list


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Fuite de mémoire en utilisant le template list
    Je ne perds pas beaucoup de mémoire mais étant donné que j'appel ma fonction extrémement souvent, je rempli tout, c'est à dire le Giga de RAM et les 512 Mo de swap.

    J'utilise donc le template list pour faire une liste.
    Je fais mon allocation normal mais j'ai quelques problèmes au niveau de la désallocation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list<C_job *> *liste_job = new std::list<C_job *>;
    je la déclare de cette maniére, j'ai donc un pointeur vers une liste de pointeur vers des objet de type C_job.

    j'effectue la désallocation de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::list<C_job *>::iterator indice;
    for(indice = liste_job->begin(); indice != liste_job->end();indice++)
    {
    	//je désalloue mon objet
    	delete *indice;
    }
    //je désalloue maintenant la liste
    liste_job->erase(liste_job->begin(),liste_job->end());
    et pour finir, dans mon programme, je désalloue le pointeur vers list
    J'aimerais savoir si ma désallocation est faite correctement?

    Merci d'avance.[/code]

  2. #2
    sas
    sas est déconnecté
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 54
    Points : 1 257
    Points
    1 257
    Par défaut
    A première vue la désallocation a l'air correcte, reste à savoir ce que contient C_job, s'il a aussi des pointeurs dans ces membres, faudrait les désallouer.
    Sinon es-tu sûr que les fuites mémoires proviennent de ces list ??

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Dans C_job, j'ai fais correctement mon destructeur donc pas de soucis de ce coté la.

    Je ne suis pas sur du tout que le problème vienne de list. Ce serais deja un début de savoir si c'est fais correctement.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(indice = liste_job->begin(); indice != liste_job->end();indice++) 
    { 
       //je désalloue mon objet 
       delete *indice; 
    }
    Cet objet est d'après ce que j'ai compris un pointeur vers quelque chose. Mais qui détruit l'objet pointé (C_job) ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    ouais, exactement

  6. #6
    sas
    sas est déconnecté
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 54
    Points : 1 257
    Points
    1 257
    Par défaut
    Citation Envoyé par diogene
    Cet objet est d'après ce que j'ai compris un pointeur vers quelque chose. Mais qui détruit l'objet pointé (C_job) ?
    la confirmation est ici

    schtroumpf_farceur >> il ne te reste plus qu'à compter tes new/delete de ton code.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par sas
    schtroumpf_farceur >> il ne te reste plus qu'à compter tes new/delete de ton code.
    le pire, c'est que pour moi tout est correct donc c'est un peu chiant. Je perds pas grand chose à chaque fois mais là ça deviens relou.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu peux peut-être ajouter de code de traçage dans tes constructeurs destructeurs pour mieux voir ce qui s'y passe (n'oublie pas les constructeurs que tu n'as pas écrit toi même et qu'il te faudra écrire juste pour tracer, comme d'éventuels constructeurs par recopie).

    Autrement, poster ici un ECM (exemple complet et minimal, complet en ce qu'il permet de reproduire le problème et être directement compilable, minimal dans le sens où il ne doit contenir que ce qui permet de reproduire le problème).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    En fait, ça va etre difficile de pouvoir mettre des exemples, car je fais de la programmation par contraintes, en utilisant ECLiPSe qui fais cela en prolog. J'ai codé une contraintes globales en C++. Ce qui veut dire que je ne peut pas la tester comme je veux, c'est plutôt lourd comme manière de faire du code C++. Mais je n'ai pas le choix.

    Je ne sais pas si tout le monde m'as compris, en tout cas, ce que je peux dire c'est que je ne pas donner d'exemples.

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Et ?
    Cela n'empêche pas de tester des algos et des bouts de codes dans des programmes de 20 lignes qui ne reposent sur aucunes contraintes autres que le langage.
    Sorti des gros debug et des ajouts de traces lourdes dans tout le code, c'est un bon moyen (les ECM) de tester, valider, comprendre, ...

    Quant aux listes, mais pourquoi diable les manipuler par référence ("sémantique de .. référence", même si tu utilise pointeurs bruts ou intelligents) ? Elles ont une sémantique de valeur, il faut en profiter.
    La liste n'est d'ailleurs pas ce qu'il y a de moins couteux en occupation mémoire. Seul le type de remplissage/vidage (fréquents en plein milieu) peut vraiment justifier cette structure par rapports aux vector et autres deque.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 11
    Dernier message: 02/12/2013, 20h49
  2. Fuite mémoire sur une classe template.
    Par robinsondesbois dans le forum Langage
    Réponses: 17
    Dernier message: 11/07/2013, 16h38
  3. Réponses: 31
    Dernier message: 19/09/2011, 10h37
  4. Réponses: 3
    Dernier message: 06/09/2010, 18h26
  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