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

SL & STL C++ Discussion :

Fuites mémoires avec Vector


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Fuites mémoires avec Vector
    BOnjour à tous!

    Déjà merci de prendre le temps de lire mon post !

    Ensuite je pense que c'est un cas déjà traité, j'ai fait une recherche sur tous les problémes de fuite mémoire mais je ne vois pas comment faire dans mon cas.

    En gros, j'ai deux structure de données :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    struct Toto
    {
    std::vector<Etat*> listTrip;
    }
     
     
    struct Etat
    {
        int a;
        int b;
        int c;
        int d;
        int e;
    }
     
    Et dans mon programme je fais : 
     
    for (condition)
    {
            Etat* course = new Etat;
            course->a = (données);
            course->b =  (données);
            course->c = (données);
            course->d = (données);
            course->e = (données);
     
            toto->listTrip.push_back(course);
    }
    Ensuite je me sers plus loin dans mon programme de la liste de courses que j'ai faite...

    Mais on voit bien que je fais un new dans une boucle et que fatalement cela va découler sur des fuites mémoires si aucun delete n'est fait. Ce que purify me dit...

    Je reçois des informations de l'exterieur, et donc cette boucle for j'y retourne plusieurs fois...

    J'aimerai savoir comment faire pour effacer cette liste lorsque je n'en ai plus besoin ?

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Quand la structure est détruite -> delete
    Autre solution, les pointeurs intelligents.

  3. #3
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Je te conseil de passer par des pointeurs intelligents:

    si tu n'as pas boost :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <memory>
    ...
    struct Toto
    {
    std::vector< std::auto_ptr<Etat> > listTrip;
    }
    ...
    si tu as boost : http://miles.developpez.com/tutoriel...ost/smartptrs/

    En passant par des pointeurs intelligents, lorsque tu fais un listTrip.clear(), les data sont detruites automatiquement

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    SURTOUT PAS des auto_ptr !!
    Il y a beaucoup d'affectations dans les conteneurs de la STL et la mémoire serait perdue!

    Il faut utiliser un boost::shared_ptr() ou un pointeur tout bète.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    De toute manière, les auto_ptr ne passent pas avec les conteneurs standards, ça plante à la compilation, si le compilateur est standard.

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    wai les pointeurs intelligents...Le soucis c'est que je n'ai pas la possibilité d'ajouter des "packs" au projet...

    Sinon, à un moment donné, je fais :

    toto->oldListTrip = toto->listTrip;

    Pour en fait pouvoir comparer ces 2 listes dans le but d'effectuer des changements sur mon IHM si jamais il y a des valeurs qui ont bougé.

    Et si jamais j'efface tous les pointeurs de toto->listTrip, est ce que les pointeurs de toto->oldListTrip seront effacés ?
    Si j'ai bien compris ? Oui...

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Eh oui... D'où l'intérêt des pointeurs intelligents !
    Une piste : copie simplement les headers dans ton projet, ça passera sans problème et personne n'y verra rien - tout est templaté, il n'y a pas de .cpp, comme c'est indiqué dans mon tuto d'ailleurs -

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok je vais tester ça merci

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Heu... sinon dans ce cas précis tu n'as que des structures, tu pourrais aussi bien utiliser un vector<Etat>, ca règlerait le problème (et puis c'est un peu comme ca qu'on est sensés utiliser la stl). Sinon, dans boost il y a beaucoup mieux que les smart pointer pour gérer les collections: les pointer containers.
    Ce sont des classes calquant le fonctionnement des containers de la stl mais où tout est utilisé par pointeur et libéré automatiquement. C'est plus joli niveau syntaxe et probablement plus optimisé à grande échelle.

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok et donc pour appliquer ces smart pointers à mon probléme, j'ai un peu de mal donc si je reprends mon code :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    struct Etat
    {
        int a;
        int b;
        int c;
        int d;
        int e;
    }
    
    typedef boost::shared_ptr<Etat>EtatPtr; // ça c'est bon ? 
    
    ENSUITE JE VOIS PAS TROP OU FAIRE LES MODIFS ? 
    
    struct Toto
    {
    std::vector<Etat*> listTrip; // ici y a t-il des modifs à faire ?
    }
    
    
    
    Et dans mon programme je fais : 
    
    for (condition)
    {
            Etat* course = new Etat;  // Et là, modifs à faire ??
            course->a = (données);
            course->b =  (données);
            course->c = (données);
            course->d = (données);
            course->e = (données);
    
            toto->listTrip.push_back(course);
    }
    J'ai essayé pas mal de choses mais je n'arrive pas à compiler ou alors lorsque cela compile, mes fuites sont toujours présentes...

    Merci à tout ceux qui pourront m'aider !

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par ..alex..
    Ok et donc pour appliquer ces smart pointers à mon probléme, j'ai un peu de mal donc si je reprends mon code :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    struct Etat
    {
        int a;
        int b;
        int c;
        int d;
        int e;
    }
    
    typedef boost::shared_ptr<Etat> EtatPtr; // ça c'est bon ? 
    
    ENSUITE JE VOIS PAS TROP OU FAIRE LES MODIFS ? 
    
    struct Toto
    {
    std::vector<Etat*> listTrip; // ici y a t-il des modifs à faire ?
    }
    
    
    
    Et dans mon programme je fais : 
    
    for (condition)
    {
            Etat* course = new Etat;  // Et là, modifs à faire ??
            course->a = (données);
            course->b =  (données);
            course->c = (données);
            course->d = (données);
            course->e = (données);
    
            toto->listTrip.push_back(course);
    }
    J'ai essayé pas mal de choses mais je n'arrive pas à compiler ou alors lorsque cela compile, mes fuites sont toujours présentes...

    Merci à tout ceux qui pourront m'aider !
    Si tu n'utilises pas ton objet, ça ne sert pas à grand chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Toto
    {
    std::vector<EtatPtr> listTrip; Là, on l'utilise
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (condition)
    {
            EtatPtr course(new Etat);  // Et là, modifs à faire ?? OUI !!
            course->a = (données);
            course->b =  (données);
            course->c = (données);
            course->d = (données);
            course->e = (données);
    
            toto->listTrip.push_back(course);
    }

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok merci pour cette réponse rapide Miles !

  13. #13
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Toto
    {
    std::vector<Etat> listTrip;
    }
    Tout simplement.

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par loufoque
    Ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Toto
    {
    std::vector<Etat> listTrip;
    }
    Tout simplement.
    Non cela ne fonctionne pas pour mon application...

    ok j'ai mis les header seulement de Boost comme tu me l'as suggéré miles, et maintenant à la compilation, il me manque quelque chose saurais tu quoi exactement ?

    J'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    error LNK2001: unresolved external symbol "void __cdecl boost::throw_excep
    tion(class exception const &)" (?throw_exception@boost@@YAXABVexception@@@Z)
    build\appli.exe : fatal error LNK1120: 1 unresolved externals
    scons: *** [build\appli.exe] Error 1120
    Merci

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il faut ajouter un fichier d'en-tête apparemment
    Tu as copié aussi les autres fichiers que l'en-tête shared_ptr demandait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <boost/assert.hpp>
    #include <boost/checked_delete.hpp>
    #include <boost/throw_exception.hpp>
    #include <boost/detail/shared_count.hpp>
    #include <boost/detail/workaround.hpp>

  16. #16
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok merci pour tout !

    Cela fonctionne

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

Discussions similaires

  1. fuite mémoire avec l'unité IdHTTP
    Par BaldeckJ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/08/2009, 20h31
  2. Détection de fuites mémoire avec Valgrind
    Par dj.motte dans le forum GTK+ avec C & C++
    Réponses: 25
    Dernier message: 22/11/2008, 08h49
  3. Fuite mémoire avec code externe
    Par samW7 dans le forum C++
    Réponses: 8
    Dernier message: 01/02/2008, 02h33
  4. [AJAX] Appolo 13 - Fuite mémoire avec XHR
    Par mecatroid dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/09/2007, 14h52
  5. Fuite mémoire avec valgrind
    Par franchouze dans le forum C++
    Réponses: 3
    Dernier message: 05/06/2006, 16h47

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