Vecteur Des Itérateurs Incompatible
J'ai une classe avec un std::vector membre de données par exemple
class foo{
public:
const std::vector<int> getVec(){return myVec;} //other stuff omitted
private:
std::vector<int> myVec;
};
Maintenant à une partie de mon code principal, je suis en train de parcourir le vecteur comme ceci:
std::vector<int>::const_iterator i = myFoo.getVec().begin();
while( i != myFoo.getVec().end())
{
//do stuff
++i;
}
Le moment je atteindre cette boucle, j'obtiens l'erreur susmentionnée.
- Vous êtes de retour une copie du vecteur, probablement, vous voulez retourner un
const std::vector<int>&
- Avez-vous vraiment envie de retourner une copie de votre vecteur?
- Veuillez ne pas retourner const valeurs des fonctions, car il inhibe C++11 sémantique de déplacement.
- l'erreur est-ci dans le titre je présume.
- Je n'ai jamais vu une erreur qui lit simplement, sur son propre, "Vecteur Itérateurs Incompatible"
- C'est un VC++ runtime affirmation message.
- Rien d'autre à tous est de sortie?
- Non pas que je me souviens (autres que l'habituel affirmation stacktrace info), mais ensuite je ne vois pas cette affirmation très souvent moi-même. ;-]
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle vous faites cela, c'est que les itérateurs sont de deux (ou plus) des copies différentes de myVec. Vous êtes de retour une copie du vecteur à chaque appel à
myFoo.getVec()
. Donc les itérateurs sont incompatible.Quelques solutions:
Retour const référence à la
std::vector<int>
:Une autre solution, probablement préférable serait de faire une copie locale du vecteur et de l'utiliser pour obtenir votre itérateurs:
Aussi +1 pour ne pas
using namespace std;
Vous êtes de retour une copie du vecteur. Parce que vous êtes de retour en valeur votre appel à begin() et end() sont complètement différents vecteurs. Vous avez besoin de retourner un const & à elle.
Je voudrais faire cela de façon un peu différente cependant. Je voudrais faire de la classe un peu comme un conteneur standard
Une autre cause de l'MSVC STL debug assertion "vecteur itérateurs incompatible" exploitation invalidé itérateur.
I. e.
v.erase(i)
, puis de les compareri != v.end()
l'effacer invalidei
et ne peut donc pas être utilisé dans une comparaison.Le problème, c'est que vous avez toujours retourner une autre copie du vecteur. Référence:
bien, je ne pense pas que vecteur de copie pourrait être la seule cause, qui semble être trop obivious pour moi.
dans mon cas, j'ai juste trouver que corrompu pile, tas, uninteneded changements pourraient aussi entraîner dans cette défaillance, et il sera en fait de cacher la raison sous-jacente. dans mon cas, j'ai changé pour l'utilisation de l'indexeur à parcourir et de trouver la cause racine.
Une autre raison pour laquelle cette assertion peut déclencher est si vous voulez allouer "foo" avec "malloc" au lieu de "nouveau", effectivement sauter le constructeur(s).
Il est peu probable de se produire à un projet développé à partir de zéro en C++, mais lors de la conversion de la plaine-C code C++ (remplacement d'un tableau statique[] dans certains struct avec une stl-vecteur) vous pourriez ne pas réaliser que la dynamique des instances de ladite structure (et les membres à l'intérieur) ne vont pas avoir leur constructeur appelé - à moins que vous modifiez également les 'malloc' à 'nouveau'.
Vous faites une constante copie des états vecteur, de ne pas accéder au membre vecteur.
Changer cela:
à ceci:
Pour aller un peu plus loin, l'itérateur vous obtenez à partir de cette déclaration:
est un itérateur à la copie temporaire de votre vecteur, qui disparaît après que l'exécution d'une instruction, d'invalider l'itérateur.
Changement
à
Votre getVec() renvoie une copie de la membre de vecteur, de sorte que les deux getVec() vous appelle à faire pour récupérer les itérateurs obtenir des itérateurs pour des récipients différents. Qui est, vous ne pouvez pas atteindre getVec().fin() à partir d'une autre getVec().begin() itérateur sans invoquer un comportement indéfini.
Vous pouvez résoudre ce problème de deux façons:
1) Ont getVec retour const référence (qui est, const std::vector&) (de préférence) ou de...
2) Remplacer les deux getVec() appelle à un et enregistrer le résultat dans un std::vector variable. Ensuite, utilisez cette variable pour les deux appels à begin() et end(). E. g:
Parce que vous êtes de retour en valeur votre appel à begin() et end() sont complètement différents vecteurs. Vous avez besoin de retourner un const & elle