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 :

Problème d'allocator


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Resolu]Problème d'allocator
    voila, je me présente, je suis nouveau, je programe en C++ depuis 3 semaines, avant j'avais seulement apris le java en cour.
    mon problème est le suivant (je l'ai complêtement identifier, ça simplifira ça compréhention et la solution pour m'aider ^^) :

    pour arrivé directement à l'essentiel j'ai :
    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
     
    typedef list<Gene*> structAdn;
    class Chromosome{
    ...
    structAdn adn;
    ...
    }
    typedef list<Chromosome> chromolist;
    typedef map<string,Gene*> reference;
    class Genotype
    {
    ...
    reference * pointeurPere;
    reference * pointeurMere;
    chromolist genomPere;
    chromolist genomMere;
    ...
    }
    là où le problème ce pose c'est que les "pointeurPere" et "...Mere" me serve à localisé un Gene* dans un Chromosome pour ensuite faire pointer des objet dessu (d'autre Gene qui ont pour particularité d'avoir en interne un autre Gene*).
    Lors de l'appel du constructeur de Genotype de fait les map reference qui lie les nom des Gene avec un pointeur sur eux, pour les retrouver plus rappidement quand je créé plus tard les Gene qui utiliseront ces pointeurs.

    La où mon problème ce pose : les allocator par défaut de la STL qui von avec le map, me pause un problème, j'aimerai bien détruire les map de reference entre String et Gene*, le problème qui se pause, si je fait un

    delete pointeurPere;

    cela se traduit par un appel de la destruction du map, qui possède un allocator par défaut qui lui lance un

    delete Gene;

    de tout les élément du map, or, les génes sont toujours utilisé, et du cou ça me bousille ma structure de donné, et si je fait l'appel du destructeur de map dans le ~Genotype(), je me retrouve devant le nouveau problème que ce cou si, les Gene du map n'existe plus et les pointeur du map pointe sur une zone de mémoire quelconque, et j'ai un gentil seg fault.

    la solution que je cherche : comment modifier l'allocator d'un map pour lui dir de ne rien faire, ou de seulement géré les string, parceque sinon j'ai une très légère fuite de mémoire puisque je ne peut pas delete les pointeur de map<string,Gene*>

    j'ai la réputation d'être extrèment peut claire, et toujours particulièrement compliquer, donc pour mon premier poste est ce que je doit réexpliquer un truc pas claire ?

  2. #2
    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
    Tu n'as pas besoin de toucher à l'allocateur.
    La map ne détruira jamais rien, de pointé, pour toi.
    C'est à toi de réaliser la destruction à l'endroit qui va bien.

    (Attention au destructeur de Chromosome qui détruirait les gene de la liste, si tu n'as pas explicité les opérations de recopie.)
    Un pointeur sur une map me parait super moyen, et la porte ouverte aux problèmes. D'ailleurs c'est quoi cette histoire de créer une map dans le constructeur. Quelle map, ou est-elle ?

    Typiquement, un bon diagramme mettant en évidance qui est responsable de qui serait un bon début.
    Sinon, un ECM sera le bienvenu -- j'ai envie de te dire de te concentrer sur tes constructions, destructions et aussi tes copies.
    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...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    donc tu dit que les container de la STL ne gère par les allocation des pointeur, lorsque leur élément sont des pointeurs ... donc si j'ai une list<Gene*> je doit, dans le destructeur lui même faire un (pour simplifier) while(iterator!=list.end()){ delete (*iterator); } ?
    parceque bon, de ce que j'ai lu, ce genre d'opération invalide mon iterator dès la première suppression puisque ma list change de forme à ce moment là ... donc je remet pas en doute ce que tu dit, si tu en est sur, mais je voi absolument pas comment "nettoyer" un container de pointeur en appelant un delete sur chaque élément ...

  4. #4
    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
    Non. C'est std::cont::erase() qui invalide tous les iterateurs uniquement dans le cas de certains containers comme p.ex. les vecteurs. Les containeurs où chaque itérateur pointe sur un noeud différent ne sont pas touchés (list, set, map). L'itérateur passé en paramètre à erase() étant bien invalidé pour tous les conteneurs.
    "delete *it;" libère et détruit l'objet pointé par le pointeur référencé par l'itérateur. Il y a deux indrections avant d'ariver à l'objet (au sens OO).
    Je te laisse te reporter à la FAQ.

    Sinon, une des solutions "simple" est d'avoir un containeur de pointeurs intelligents à comptage de références (comme p.ex. boost::shared_ptr<>)
    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...

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    oka, bas je vais commancer par correctement détruire tout mes conteneur à leur fin de vie, et je verrai ensuite si j'ai toujours le prob ^^
    vu que je vais en avoir pour un certain temps de coder tout les destructeurs, je pense que le problème sera réglé, merci

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

Discussions similaires

  1. Problème d'allocation mémoire
    Par araya dans le forum C
    Réponses: 2
    Dernier message: 04/05/2006, 20h03
  2. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23
  3. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  4. fenetre MDI - problème d'allocation
    Par say dans le forum C++Builder
    Réponses: 8
    Dernier message: 03/11/2005, 17h06
  5. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18

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