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 :

New & delete -> bizarre


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut New & delete -> bizarre
    Bonjour,

    alors j'ai un petit probleme avec mes pointeurs et je comprend pas pk?


    Bon je suis entrain de faire une GUI avec wxWidget, et je créer un arbre dynamiquement en lisant un fichier XML. Ma GUI permet aussi de supprimer une des feuilles de l'arbre. Cependant quand j'appelle: delete confXmlS400[ID_board]; j'obtiens une erreur de segmentation.

    Pour mieux comprendre je vais copié les bouts de code important!

    Déclarations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class S400Manager {
     
    public:
    void makeChildren();
    void OnDeleteS400(wxCommandEvent& event);
     
    private:
    std::vector<wxWindow *> treeLeaf;
    std::vector<wxXmlNode *> xmlChildNode;
    }

    Initialisation des object s400:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    S400Manager::makeChildren() {
         for(int i=0;i<childNode.size();i++) {
               ConfigXMLS400 *s400 = new ConfigXMLS400(treeLeaf[i],xmlChildNode[i]);
               S400Vec.push_back(s400);
         }
    }

    Suppression d'un ou plusieurs objet s400, l'index des objets a supprimer est contenu dans le tableau selIDVec .

    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 S400Manager::OnDeleteS400(wxCommandEvent& event) {
    	for(int i=0;i<selIDVec.size();i++) {
    		int ID_board=selIDVec[i];
    		//First delete the node from the tree
    		confXmlS400[ID_board]->RemoveFromTree();
    		//Then delete the XML node 
    		node->RemoveChild(confXmlS400[ID_board]->getXmlNode());
     
    	       //Delete the object pointed by the vector
    		delete confXmlS400[ID_board]; #Cette ligne me provoque une segmentation fault 
     
    		//and set the corresponding pointer to NULL
    		confXmlS400[ID_board] = NULL;
    		//Print in the log that this panel has been deleted
    		wxLogMessage(_T("Remove Board #%d"),ID_board);
    	}
     
    	//Delete all the vector which are equal to NULL
    	for(int i=0;i<confXmlS400.size();i++) {
    		if(confXmlS400[i]==NULL) {
    			confXmlS400.erase(confXmlS400.begin()+i);
    		}
    	}
    }
    Si qqun peux m'expliquer pk ca ne marche pas je serais content.

    PS: Encore une petite question, si mon object s400Manager est detruit, celui-ci appel automatiquement les destructeur de mes objets s400 contenu dans le vecteur ou faut il que je face un appel explicit par delete dans le destructeur de s400Manager??

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par elraton Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	//Delete all the vector which are equal to NULL
    	for(int i=0;i<confXmlS400.size();i++) {
    		if(confXmlS400[i]==NULL) {
    			confXmlS400.erase(confXmlS400.begin()+i);
    		}
    	}
    }
    Quand tu fais un erase ça décale les éléments, cf. cette entrée de la FAQ.

    Citation Envoyé par elraton Voir le message
    Encore une petite question, si mon object s400Manager est detruit, celui-ci appel automatiquement les destructeur de mes objets s400 contenu dans le vecteur ou faut il que je face un appel explicit par delete dans le destructeur de s400Manager??
    Il faut que tu appelles delete manuellement dans le destructeur de s400Manager.

    MAT.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    ouais je m'étais rendu compte du problème..., du coup je commence par la fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Delete all the vector which are equal to NULL
    for(int i=confXmlS400.size()-1;i>=0;i--) {
    	if(confXmlS400[i]==NULL) {
    		confXmlS400.erase(confXmlS400.begin()+i);
    		}
    	}
    CELA NE CHANGE CEPENDANT PAS MON PROBLEME, voila un log de mon stack

    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
     
    Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.)	
    	15 <symbol is not available> 0x0313035e	
    	14 <symbol is not available> 0x03282440	
    	13 <symbol is not available> 0x00000001	
    	12 <symbol is not available> 0x0022eacc	
    	11 <symbol is not available> 0x0022eafc	
    	10 <symbol is not available> 0x03235fb0	
    	9 <symbol is not available> 0xffffffff	
    	8 <symbol is not available> 0xffffffff	
    	7 <symbol is not available> 0x00000001	
    	6 <symbol is not available> 0x000000c8	
    	5 <symbol is not available> 0x00000096	
    	4 <symbol is not available> 0x0000006c	
    	3 <symbol is not available> 0x0022ea7c	
    	2 GDI32!CreateCompatibleBitmap()  0x77ef7581	
    	1 <symbol is not available> 0x00000000

  4. #4
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Visiblement c'est due au fait que les wxWidget ce détruise automatiquement a la fermeture de la fenetre donc pas besoin de les delete mais si l'on a pas besoin d'eux

    C'est quand meme bizarre que ca me bug au moment du delete et pas au moment de la fermeture de la fenêtre (En cherchant a deleter une deuxième fois le pointeur)

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

Discussions similaires

  1. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  2. Surdéfinition de new et delete
    Par couet dans le forum C++
    Réponses: 3
    Dernier message: 09/02/2007, 15h19
  3. surdefinition operateur new et delete
    Par johjoh dans le forum C++
    Réponses: 23
    Dernier message: 08/12/2006, 10h10
  4. intrigue sur la surcharge du new et delete
    Par swirtel dans le forum C++
    Réponses: 12
    Dernier message: 07/09/2006, 15h23
  5. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29

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