std :: векторная проблема прерывания - PullRequest
0 голосов
/ 06 января 2011

Я испытываю затруднения с приведенным ниже примером, последняя строка выдает ошибку "abort is found". Я не понимаю, почему это должно быть.

Я использую (* abc) .def вместо abc-> def для ясности в этом случае.

#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
}

1 Ответ

6 голосов
/ 06 января 2011

Проблема с этим кодом в том, что trunk.left() возвращает копию ветви, а не ссылку на ветку. Следовательно, ваш указатель focus3 указывает на временный объект, который будет немедленно очищен после завершения выполнения этой строки кода. Следовательно, когда вы пытаетесь разыменовать focus3 в последней строке, вы следуете указателю на данные мусора, что приводит к сбою.

Чтобы это исправить, либо left верните ссылку на ветвь, либо сделайте focus3 константную ссылку, которая продлевает время жизни временного объекта до времени жизни ссылки.

...