std :: vector中止问题

时间:2011-01-05 23:46:47

标签: c++ vector stdvector abort

我正在尝试下面的例子,最后一行产生了一个“abort has called called”错误。我不明白为什么会这样。

我在这种情况下使用(* 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 个答案:

答案 0 :(得分:6)

此代码的问题是trunk.left()返回分支的副本,而不是对分支的引用。因此,您的focus3指针指向一个临时对象,该对象在该行代码完成执行后立即被清除。因此,当您尝试在最后一行解除引用focus3时,您将关注指向垃圾数据的指针,这会导致崩溃。

要解决此问题,要么left返回对分支的引用,要么使focus3成为const引用,这会将临时的生命周期延长到引用的生命周期。