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 :

Modification de pointeur non effective à la sortie de la fonction


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    À mon avis, c'est parce que des pointeurs sont copiés, puis les objets pointés détruits, alors que le vecteur contient toujours les pointeurs...

  2. #22
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    ET si c'est bien ça, comment l'en empêcher ?

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    En copiant les objets eux-mêmes et non juste les pointeurs quand tu copies tes vecteurs ?

    Ou en utilisant les Smart Pointers de Boost, notamment les shared_ptr<> ?

    Ou encore, pourquoi pas, en implémentant chaque arbre comme une classe COM ?

  4. #24
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Hmmm.

    Maintenant c'est pire : Processus arrêté au lieu de seg fault

    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
    void Programme::copy(const Programme* prog)
    {
        //*(this) = (*prog);
     
        adresse_deb = prog->adresse_deb;
        adresse_fin = prog->adresse_fin;
        identification = prog->identification;
     
        size = prog->size;
        nbAppel = prog->nbAppel;
     
        recursif = prog->recursif;
        sse = prog->sse;
        x87 = prog->x87;    
     
        sousProgramme.clear();
        for(unsigned int i = 0; i < prog->sousProgramme.size(); i++)
        {
            Programme *tmp;
     
            tmp = new Programme(* prog->sousProgramme[i]);        
            sousProgramme.push_back(tmp);
        }
    }

  5. #25
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben il faut voir aussi tes constructeurs de copie...
    D'ailleurs, j'ai du mal à comprendre pourquoi tu fais une fonction membre copy()...

  6. #26
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Tout simplement pour ça :
    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
    void Graphe::modifierNoeud(Programme* sousProg)
    {
        int nbRacine = sousProg->getTotalSousProg();
     
        Programme *tmpNoeud = NULL;
        Programme *tmpSousNoeud = NULL;
     
        for(int i = 0 ; i < nbRacine ; i++)
        {
            tmpNoeud = sousProg->getSousProg(i);
            int nbSousNoeud = tmpNoeud->getTotalSousProg();
     
            for(int j = 0 ; j < nbSousNoeud ; j++)
            {
                tmpSousNoeud = tmpNoeud->getSousProg(j);
                if(tmpSousNoeud->getAdressFin().empty())
                {
                    int position = racine->getPosition(tmpSousNoeud->getAdressDeb());
     
                    if(position > -1)
                    {
                        tmpSousNoeud->copy(racine->getSousProg(position));
     
                        modifierNoeud(tmpSousNoeud);
                    }
                }
            }
        }
    }
    Mon constructeur :
    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
    Programme::Programme(const Programme& p)
    {
        adresse_deb = p.adresse_deb;
        adresse_fin = p.adresse_fin;
        identification = p.identification;
     
        size = p.size;
        nbAppel = p.nbAppel;
     
        recursif = p.recursif;
        sse = p.sse;
        x87 = p.x87;
     
        for(unsigned int i = 0; i < p.sousProgramme.size(); i++)
        {
            Programme *tmp;
     
            tmp = new Programme(* p.sousProgramme[i]);        
            sousProgramme.push_back(tmp);
        }
    }
    En fait ça fonctionne j'ai l'impression mais ce doit être la récursivité qui coince si j'ai un trop grand arbre. D'où le processus arrêté.

    Il va falloir que je trouve un moyen pour créer tout ça.

  7. #27
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Donc, copy() est l'équivalent d'un opérateur = virtuel ?

  8. #28
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour.
    Tu as une belle fuite mémoire
    car sousProgramme est un vecteur de pointeur. Donc la mémoire n'est pas désalloué par clear.
    Remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     for(unsigned int i = 0; i < sousProgramme.size(); ++i)
        {
            delete sousProgramme[i];        
        }
    sousProgramme.clear();

    Ou avec les iterator


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<Programme *>::iterator it;
     
    for(it =sousProgramme.begin();it !=sousProgramme.end(); ++it)
        {
            delete *it;        
        }
    sousProgramme.clear();

  9. #29
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Effectivement pour la fuite. Je la modifie.

    Sinon pour l'opérateur virtuel oui.

    Sinon ça ne changera rien au fait que je change tout ça. C'est surtout dans le parcours que ça bloque car trop long. J'analyse un fichier contenant 1500 programme. Et pour chacun d'entre eux je voulais rajouter toutes les données de manière récursive. Mais visiblement c'est trop lourd pour lui. Donc je vais me limiter à 3 noeuds.

    Sauf si vous avez une idée

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Pointeur non modifié à l'interieur d'une fonction ? o_O
    Par stephane.lallee dans le forum SL & STL
    Réponses: 8
    Dernier message: 19/03/2009, 16h06
  2. Modifications non effectuées sur sortie de formulaire
    Par jojodid dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/08/2008, 16h19
  3. OnMouseOver : modification du pointeur
    Par pimpmyride dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/04/2006, 18h22
  4. comparaison de pointeur non portable
    Par kykyn dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 10h58

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