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
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top