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 :

destruction d'un objet


Sujet :

C++

  1. #21
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Oui les 2 seules situations qui provoquent le fait que les éléments dans le vecteur ne sont plus utiles sont

    a) La fermeture de l'application (donc faire les delete dans le destructeur)
    b) L'ouverture d'un nouveau modèle (donc les coordonnées de l'ancien modèle sont désuètes).


    Ce sont les 2 cas ou je devrai faire des delete.

    Je met ca en pratique et je te tiens au courant

  2. #22
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Alors voilà à quoi je suis arrivé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void GL_MAILLAGE::Free() 
    {
       std::vector<std::vector<MG_NOEUD*> >::iterator i;
     
       for (i = coord_noeuds.begin() ; i != coord_noeuds.end() ; ++i) {
           std::vector<MG_NOEUD*>::iterator j;
           for (j = (*i).begin() ; j != (*i).end() ; ++j) {
               delete *j;
           }
       }  
    }
    Mais je fais quelque chose de pas correct car j'ai une SegFault...


    Également,
    Le problème que je me rend compte maintenant est que je ne peux pas aller les effacer lorsque "je charge un autre fichier" car les canevas OpenGL se rafraichissent tout le temps et je vais lire dans mon vecteur les coordonnées... Je ne peux donc que le faire dans le destructeur

  3. #23
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    essaie de rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*j != NULL) delete *j;
    Cependant je le répète, est-ce que tu as VRAIMENT besoin de poiteurs...

    Je pense qu'il est beaucoup plus simple de rendre une classe copiable et d'utiliser des instances que d'utiliser des pointeurs

    ta classe MG_NOEUD a déjà un constructeur par copie, fait lui un opérateur d'assignation (operator=) et un destructeur et utilise un vector<MG_NOEUD>

    tu n'auras plus besoin de faire de new ni de delete

    au besoin, je peux même t'aider à faire l'opérateur d'assignation et le destructeur, il n'y a besoin pour cela que de la signature de la classe (en fait juste les données membres), et les constructeurs qui existent déjà (y compris celui par recopie)
    à partir de ça, on pourra faire ces deux petites fonctions supplémentaires et tu n'auras plus besoin de pointeurs...

    en C++, les pointeurs sont très rarements à utiliser...
    C'est uniquement dans les cas où on ne peut pas utiliser les références, si on a besoin d'avoir un type NULLable, si on a une classe qui ne peut être copiée de part sa sémantique (un flux par exemple), et sûrement quelques autres rares exceptions que j'oublie

    mais je ne pense pas que ce soit le cas ici ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #24
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Hum le problème que j'ai est que je n'ai pas vraiment la possibilité de modifier MG_NOEUD (je développe actuellement une petite interface pour Unix d'un programme qui existe déjà).


    Ce qui est curieux c'est que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void GL_MAILLAGE::Free() 
    {
       std::vector<std::vector<MG_NOEUD*> >::iterator i;
     
       for (i = coord_noeuds.begin() ; i != coord_noeuds.end() ; ++i) {
           std::vector<MG_NOEUD*>::iterator j;
           std::vector<MG_NOEUD*> v = *i;
           for (j = v.begin() ; j != v.end() ; ++j) {
                MG_NOEUD * no = *j;
           }
       }  
    }
    Fonctionnent...

    Alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void GL_MAILLAGE::Free() 
    {
       std::vector<std::vector<MG_NOEUD*> >::iterator i;
     
       for (i = coord_noeuds.begin() ; i != coord_noeuds.end() ; ++i) {
           std::vector<MG_NOEUD*>::iterator j;
           std::vector<MG_NOEUD*> v = *i;
           for (j = v.begin() ; j != v.end() ; ++j) {
                if (*j != NULL) 
                    delete *j;
            }
       }  
    }

    plante...


    On dirait c'est le delete qui aime pas Pourtant il ne delete pas NULL...

  5. #25
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    très étrange oui...

    pour ce qui est de MG_NOEUD, tu as au moins la doc dessus ?

    bon... sinon, voilà ce qu'on va essayer (au pire, c'est pareil, si ça doit planter, on le saura vite ^^)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void MyFrame::readFile(const std::string &filepath) 
    {
    std::vector<MG_NOEUD*> coord; 
    for (int i=0 ; i < nb_maillage ; i++) {
       MG_MAILLAGE *mai = fichier.get_mg_maillage(i);
     
      /* Extraire noeuds */
      for (unsigned int j = 0 ; j < mai->get_nb_mg_noeud() ; j++)
             coord.push_back(*mai->get_mg_noeud(j));
       m_glCanvas->PushNoeuds(coord);
    }
    tu oublies Free, et coord_noeuds devient un vector< vector<MG_NOEUD> >

    comme ça, tu n'auras plus de pointeurs
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #26
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Hum j'essaye de déclarer no comme une variable car je m'en sert pour quelque lignes après (que je n'avais pas montrer avant puisqu'elle étaient inutiles pour mon cas)

    Mais ce que je fais est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          std::vector<MG_NOEUD> test;
     
         /* Extraire noeuds */
         for (unsigned int j = 0 ; j < mai->get_nb_mg_noeud() ; j++) {
             MG_NOEUD no =  *mai->get_mg_noeud(j);
                test.push_back(no);
                xmax = std::max(no.get_x(),xmax);
                ymax = std::max(no.get_y(),ymax);
                zmax = std::max(no.get_z(),zmax);
                xmin = std::min(no.get_x(),xmin);
                ymin = std::min(no.get_y(),ymin);
                zmin = std::min(no.get_z(),zmin);
            }
    Le constructeur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MG_NOEUD(MG_NOEUD& mdd);
    Images attachées Images attachées  

  7. #27
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ARGL... les constructeurs par copies prennent des références constantes :'( toujours...

    c'est quoi cette classe à la ***** ?

    bon, effectivement là...

    c'est un dilemne...

    avec les pointeurs et les delete, tu obtiens un segfault tu dis ?

    sur quelle ligne ? tu es sûre que c'est bien celle du delete ? (essaie avec un débuggueur)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  8. #28
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Je test plus en profondeur et je te tient au courant!

  9. #29
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Curieux, si je fais

    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
     
    GL_MAILLAGE::~GL_MAILLAGE() { Free(); } 
     
     
     
    void GL_MAILLAGE::Free() 
    {
       std::vector<std::vector<MG_NOEUD*> >::iterator i;
     
       for (i = coord_noeuds1D.begin() ; i != coord_noeuds2D.end() ; i++) {
           std::vector<MG_NOEUD*>::iterator j;
           std::vector<MG_NOEUD*> v = *i;
           for (j = v.begin() ; j != v.end() ; j++) {
                if (*j != NULL) 
                     int a = 1;
                    //delete *j;
           }
       }  
    }
    Cela semble boucler à l'infini (en tout cas le programme ne repond plus).

  10. #30
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       for (i = coord_noeuds1D.begin() ; i != coord_noeuds2D.end() ; i++) {
    c'est normal lol

    tu ne tests pas sur le même conteneur
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #31
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Woah ahah



    Hum l'erreur se fait bel et bien sur le delete.

  12. #32
    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
    Normal, on ne peut pas deleter un objet, que des pointeurs vers des objets alloués dynamiquement.
    j est un iterateur, *j est un std::vector !

  13. #33
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    *j pointe sur un élément du vecteur et non sur un vecteur...

  14. #34
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Tu es bien sûr du trajet qu'effectuent tes pointeurs ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  15. #35
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Le seul trajet qu'ils font est d'être insérer dans les vecteurs lors de l'ouverture de fichier

  16. #36
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ils ne sont jamais ressortis du vecteur ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  17. #37
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Non, la seule fois qu'ils sont utilisés est par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const std::vector<MG_NOEUD*> &noeuds1D = coord_noeuds1D[maillage]

  18. #38
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Alors là, c'est un mystère, si c'est vraiment le delete qui fait planter alors que c'est allouer avec new...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  19. #39
    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 vdumont
    *j pointe sur un élément du vecteur et non sur un vecteur...
    Ah oui

  20. #40
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Bonjour, je n'ai pas tout compris lorsque tu fais :
    Citation Envoyé par vdumont
    coord est déclaré dans la fonction de lecture de fichier
    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
    void MyFrame::readFile(const std::string &filepath) 
    {
    std::vector<MG_NOEUD*> coord; 
    for (int i=0 ; i < nb_maillage ; i++) {
       MG_MAILLAGE *mai = fichier.get_mg_maillage(i);
     
      /* Extraire noeuds */
      for (unsigned int j = 0 ; j < mai->get_nb_mg_noeud() ; j++) {
             MG_NOEUD* no = new MG_NOEUD(*mai->get_mg_noeud(j));
             coord.push_back(no);
       }
       m_glCanvas->PushNoeuds(&coord);
       coord.clear();
    }
    surtout les deux dernières lignes.
    A l'avant derniere, tu copies coord dans m_glCanvas avec la méthode PushNoeuds(std::vector<MG_NOEUD*> *). C'est bien ça, non ?
    Ta méthode parcourt le vecteur en entier, et copie l'adresse de tes MG_NOEUD.
    Pour la dernière ligne, elle sert vraiment à quelque chose ? Coord disparait dans la portée de la fonction, donc je ne vois pas pourquoi tu vides le tableau.

    Je sais que cela ne t'aide pas, mais c'est que j'aimerais être sur de bien comprendre comment cela fonctionne avant de tapper à coté.

    Si j'ai bien compris, essaye (si tu ne l'as pas déjà fait) de faire un delete sur coord dans readFile.
    Cela permettra déjà de savoir si tu as un problème avant, ou si les delete fonctionnent correctement, tu sauras déjà que ça vient de pushNoeuds, ou d'un truc plus bas.

    Bonne journée.

    b Oo
    b Oo

Discussions similaires

  1. [c#]Comment forcer la destruction d'un objet précédemment créé?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/07/2009, 14h29
  2. Réponses: 2
    Dernier message: 13/10/2007, 01h55
  3. [C#] destruction d'un objet
    Par legillou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/06/2006, 11h19
  4. Réponses: 1
    Dernier message: 09/07/2005, 18h16
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

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