J'ai un vecteur déclaré:fonction d'effacement de vecteur suppression de mauvais objet
vector<Curve> workingSet;
Curve est une classe que j'ai créé qui contient une chaîne « nom » et un tableau de struct, allouée dynamiquement par le constructeur.
J'ai une boucle censée supprimer 2 (sur 4) éléments du vecteur.
vector<Curve>::iterator it = workingSet.begin();
//remove tbi's children from the working set
for ( ; it != workingSet.end();){
if (it->thisName == tbi.childAName ||it->thisName == tbi.childBName)
it= workingSet.erase(it);
else
++it;
}
Lorsque le débogueur atteint le .erase (it) appeler Je peux voir que le « it » itérateur pointe sur la courbe 2 dans le vecteur. C'est bon; Je veux que la courbe 2 soit retirée du vecteur.
Je suis alors amené par le débogueur vers le destructeur (j'ai un point d'arrêt là), ce qui devrait probablement détruire la courbe 2. Mais quand je regarde la montre 'this', je peux voir que la courbe est détruite est la courbe 4! Le destructeur procède alors à 'delete []' le tableau dans l'objet, comme requis et définit le pointeur de tableau à NULL.
Lorsque le débogueur revient au programme, après avoir terminé l'appel erase(), je peux voir que le vecteur 2 a été retiré du tableau et la courbe 4 est toujours là. Le pointeur de tableau de Curve 4 pointe toujours vers le même emplacement que précédemment, mais la mémoire a été désallouée et le tableau contient des données parasites.
Quelqu'un peut-il suggérer pourquoi la courbe 4 est en train d'être foiré?
N.b. (1) Il existe un constructeur de copie pour la classe de courbe, qui effectue une copie 'profonde'. N.b. (2) Il y a plus à la classe/programme que je l'ai mentionné ici
Btw, les pointeurs de tableau dans les courbes 2 et 4 pointent vers des emplacements différents et contiennent des valeurs différentes, selon le débogueur.
Modifier: J'ai maintenant implémenté l'affectation de copie. Maintenant, l'élément correct semble être effacé du vecteur, mais le mauvais destructeur est encore appelé! Cependant, lorsque le débogueur retourne à la courbe de tableau 4 est toujours intacte.
Pouvez-vous fournir un échantillon minimal compilable qui montre le problème? Votre description verbale n'est pas très utile. Quoi qu'il en soit: Jetez un oeil à l'Erase/Remove-Idiom. Nous avons des tonnes de questions qui sont répondues de cette façon sur SO. – pmr
Autre chose: vous ne mentionnez qu'un copieur, avez-vous également mis en place une affectation de copie? – pmr
Je n'ai pas mis en place d'affectation de copie, je vais le faire maintenant et je reviendrai vers vous. – Meir