C++ vector.erase
ledjlale
-
ledjlale -
ledjlale -
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é.
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
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!
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!
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!
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!
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!!
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!!
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)