C++ vector.erase

Fermé
ledjlale - 29 juil. 2004 à 14:42
 ledjlale - 30 juil. 2004 à 11:12
voila:
j'ai un vector (connect) de pointeur de connection defini par (terminus,terminus))
j'appel une fonction d'initialisation:
addObject(new terminus(feuille1),new terminus(feuille2));

Dans cette fonction:
connectionPtr pozy = new connect(term1,term2);
connect.push_back(pozy);
term1->getAnotherObject(pozy);

dans Another(world?):
def d'un vector de pointeur de connection (m_connect)

m_connect.push_back(pozy);

//Voila pour l'initialisation....

Maintenant, le probleme:
je rentre dans l'objet contenant addObject, puis (avec en parametre un pointeur de term):
pr_sm_Connection* conn;
ConnectionVector::iterator i;
i = m_connections.begin();
while (i!=m_connections.end())
{
printf("conn=*i size:%d " ,m_connections.size());
conn = *i;
if(conn->geTerminus()->getfeuille()==this)
{
m_connections.erase(i);
i = m_connections.begin();
}else

i++;
}
term->delanother();

dans delanother, même chose que plus haut.
pouf pouf. Ce qu'il se passe, c'est que mes connections sont bien viré dans la premiere fonction de supp( mes procedures de test me le confirment), mais lorsque je rentre dans la deuxieme fonction, il se passe que les elements dans le vector existent, mais pas le term proprement dir!
( conn->geTerminus() qui renvoi un NULL) ce qui engendre une erreur (getFeuille())

Ma question, en definitive est:
Comment réagit vecor.erase(iterator)?
Parceque j'ai l'impression que mon objet, inseré par un push_back, est effacé.

3 réponses

Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
29 juil. 2004 à 14:51
ca ressemble à un probleme de passage d'arguments non?
en gros dans ta premiere fonction tu a un vctor avec des pointeur tu le passe a la seconde qui fait des "release" de ces pointeurs et tu recupere l'objet...et la tu as encore les pointeurs mais ils pointent vers rien c'est ca?

COIN!
0
non, ce n'est pas le vector que je passe en parametre.
c'est un objet crée avant. je le passe dans un vector (push_back), puis le meme objet dans un autre vector (qui se trouve ailleurs).
Ensuite, je reviens à l'endroit de la premiere affectation, et je fait .erase(iter).
Je fais de meme avec le deuxieme qui ne possede plus l'objet, mais qui a encore son pointeur (enfin, je croi par deduction)
0
Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
29 juil. 2004 à 15:35
ca a l air d'etre un sacré sac de noeud ton histoire..
verifie dans tes passages d'argument qu' a un moment tu fait pas un passage par copie au lieu d'un passage par référence car le probleme tel que tu l'as decrit et typique de ce genre de chose

COIN!
0
Si je manipûlais des valeurs par copie, les objets ne seraient pas dependant. Or, ils le sont!
Deplus, je trravail par l'intermediaire de pointeur, donc directement sur les valeurs.
Les observations et conclusions faites sont:

Si on créé un objet (new) et qu'on fasse un push_back avec 2 vectors, ex:
Objet ob = new Objet(poilopasme);
m_vect1.puch_back(ob);
m_vect2.push_back(ob);

Puis:
m_vect1.erase(m_vect1.begin());

On observe que m_vect1.begin()==m_vect.end()
mais : m_vect2(m_vect2.begin()) !=NULL et les instances à l'interieur sont NULL!!

=> m_vect1.erase efface les'objets créént à l'interieur de l'objet de vect1.....


Plus concretement:


connect
/*********\
* getTerm()*
* *
\*********/
\ \
term1 term2

connect, term1 et term2 sont des instances (new) non nulles

on fait: v1.push_back(connect);
v2.push_back(connect);
v1.erase(v1.begin());
//et la:
v2.getTerm() existe
mais: == NULL!!
0
c'est pas plus clair comme ca?
0