std :: problème abort vecteur
Question
Je vais avoir diffuculty l'exemple ci-dessous, la dernière ligne est la production d'un « abort a été appelé » erreur. Je ne vois pas pourquoi cela devrait être.
J'utilise (* abc) def au lieu de ABC-> def pour plus de clarté dans ce cas.
#include <iostream>
#include <string>
#include <vector>
class branch
{
public:
unsigned short n;
std::vector<branch> branches;
branch left()
{
return branches.at(0);
}
};
void main()
{
branch trunk = branch();
trunk.n = 0;
branch b1, b2;
b1.n = 0;
b2.n = 5;
b1.branches.push_back(b2);
trunk.branches.push_back(b1);
branch* focus1 = &(trunk.branches.at(0));
branch* focus3 = &(trunk.left());
std::cout<<trunk.left().branches.at(0).n<<std::endl; // ok
std::cout<<(*focus1).branches.at(0).n<<std::endl; // ok
std::cout<<(*focus1).left().n<<std::endl; // ok
std::cout<<(*focus3).branches.at(0).n<<std::endl; // problem
}
La solution
Le problème avec ce code est que trunk.left()
retourne une copie de la branche, pas une référence à la branche. Par conséquent, le pointeur de la focus3
montre du doigt un objet temporaire qui est immédiatement va être nettoyé après cette ligne de code fin de l'exécution. Par conséquent, lorsque vous essayez déréférencement focus3
sur la dernière ligne, vous suivez un pointeur vers les données de déchets, ce qui provoque l'accident.
Pour résoudre ce problème, soit avoir left
renvoyer une référence à la branche, ou faire focus3
une référence const, qui prolonge la durée de vie du temporaire à la durée de vie de la référence.