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 :

[STL]destruction d'objet d'un vector


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut [STL]destruction d'objet d'un vector
    Bonjour,
    J'ai creer un vector de pointeur vers une classe CHole de mon cru:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<CHole*> m_pHoles;
    Apres avoir utilise ce vector, je m'apercois que certains elements doivent etre fusionnés avec d'autres. Je dois donc supprimer certains elements de mon vector. Ce que je fais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // delete regions which isn't source
    vector<CHole*>::iterator it=m_pHoles.begin();
    for(i=0;i<saveNumberOfRegion;i++){
    	if(tabRegion[i]!=-1){
    		delete m_pHoles[i];
    		it=m_pHoles.erase(it);
    	}
    	else
    		it++;
    }
    Mais malheureusement, ca plante a l'execution.
    Peut-etre est-ce mon destructeur de la classe CHole qui ne marche pas? En executant en mode debug, je pense que cela ne vient pas de la....
    Aurais-je fais quelque chose qu'il ne fallait pas?
    Merci d'avance pour vos reponses.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La suppression d'un itérateur rend celui-ci invalide.
    Du coup, la solution passe par plusieurs étapes:

    • déplacer les éléments en fin de tableaux en récupérant l'itérateur du premier élément à supprimer à l'aide de remove_if et std::mem_fun
    • libérer la mémoire allouée dynamiquement des éléments à supprimer
    • suprimer définitivement les éléments du tableau.


    Tu trouveras un exemple de laurent gomila sur =>ce post<=
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut
    J'ai trouve d'ou venait l'erreur!

    C'est au niveau du delete que j'ai fait une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete m_pHoles[i];
    ceci ne marche apparement pas correctement, mais je ne sais pas trop pourquoi.

    Par contre en remplacant par:
    Ca marche nickel!

    Merci pour ta reponse, meme si elle ne m'a pas trop aide... quoique c'est grace au post que j'ai resolu le probleme.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ta boucle est de toute façon incorrecte. A la première suppression, ton itérateur it et ton indice i ne correspondront plus.

    Si tu as deux tableaux dont les éléments sont liés deux à deux, il faut veiller à ce qu'ils restent synchronisés (ie. une suppression dans l'un doit donner lieu à une suppression dans l'autre). D'ailleurs, pourquoi maintenir deux tableaux en parallèle ? Ou bien est-ce que j'ai mal compris ce que tu faisais ?

  5. #5
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut
    En fait, j'ai un tableau qui me dit quelle region doit etre fusionnee avec qui (tabRegion) et un tableau contenant ces regions (m_pHoles).
    Dans le premier tableau, si la valeur est differentes de -1, je dois supprimer la region correspondante.
    Je parcours donc le premier tableau a la recherche de regions devant etre supprimees. L'iterateur est incremente a chaque fois.
    Effectivement, dans la premiere version, le i et l'iterateur n'etait pas synchro. Mais je crois que c'est maintenant le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // delete regions which isn't source
    vector<CHole*>::iterator it=m_pHoles.begin();
    for(i=0;i<saveNumberOfRegion;i++){
    	if(tabRegion[i]!=-1){
    		delete (*it);
    		it=m_pHoles.erase(it);
    	}
    	else
    		it++;
    }
    non?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui et non. Ta boucle fournira le résultat attendu, mais ton tableau tabRegion ne sera plus à jour, il comportera toujours les -1 alors que les trous correspondant auront été supprimés de m_pHoles.

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

Discussions similaires

  1. [STL]Suppression d'un objet dans un vector
    Par cssiste dans le forum SL & STL
    Réponses: 10
    Dernier message: 19/07/2007, 14h23
  2. STL - objet dans un vector/deque
    Par ivles dans le forum SL & STL
    Réponses: 11
    Dernier message: 26/02/2007, 11h38
  3. Destruction d'objet (.free) >> EAccessViolation
    Par monstroplante dans le forum Langage
    Réponses: 7
    Dernier message: 08/11/2005, 20h19
  4. destruction d'objets dans un vecteur
    Par titouille dans le forum C++
    Réponses: 12
    Dernier message: 28/07/2005, 19h20
  5. [débutante][Concept] Destruction d'objet, mode d'emploi?
    Par skea dans le forum Général Java
    Réponses: 4
    Dernier message: 12/06/2004, 21h48

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