C++ 向量中止问题

C++ 向量中止问题,c++,vector,stdvector,abort,C++,Vector,Stdvector,Abort,我与下面的例子有分歧,最后一行产生了一个“abort has called”错误。我不明白为什么会这样 我使用(*abc).def而不是abc->def,以便在本例中更加清晰 #include <iostream> #include <string> #include <vector> class branch { public: unsigned short n; std::vector<branch>

我与下面的例子有分歧,最后一行产生了一个“abort has 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
}
#包括
#包括
#包括
班支部
{
公众:
无符号短n;
std::向量分支;
左分支()
{
返回分支。at(0);
}
};
void main()
{
分支主干=分支();
n=0;
分支b1、b2;
b1.n=0;
b2.n=5;
b1.分支。推回(b2);
树干。树枝。推回(b1);
branch*focus1=&(trunk.branchs.at(0));
分支*focus3=&(trunk.left());

std::cout此代码的问题是
trunk.left()
返回分支的副本,而不是对分支的引用。因此,您的
focus3
指针指向一个临时对象,该临时对象将在该行代码执行完毕后立即被清除。因此,当您尝试在最后一行取消引用
focus3
时,您正在跟随一个指向ga的指针rbage数据,导致崩溃


要解决此问题,请让
left
返回对分支的引用,或使
focus3
成为常量引用,从而将临时对象的生存期延长到引用的生存期。

此代码的问题在于
trunk.left()
返回分支的副本,而不是对分支的引用。因此,您的
focus3
指针指向一个临时对象,该临时对象将在该行代码执行完毕后立即被清除。因此,当您尝试在最后一行取消引用
focus3
时,您正在跟随一个指向ga的指针rbage数据,导致崩溃


要解决这个问题,要么让
left
返回对分支的引用,要么让
focus3
成为常量引用,将临时对象的生存期延长到引用的生存期。

什么操作系统?什么编译器?也->比(*p)清晰得多。定义什么操作系统?什么编译器?也->比(*p)清晰得多.defAh,
const
引用是好的,但OP必须使用
const
方法来使用它。没错,但我坚信这是个好主意。(如果你不同意,请不要与我开战;这不值得争论。):-)我使用引用时添加了一个&after分支和before left()。这非常有效。在这种情况下,此解决方案也更加高效,允许编辑和阅读。虽然此示例是一段外观完全不同的代码的简化版本。啊,
const
参考很好,但OP必须使用
const
方法。没错,但我坚信这是正确的好主意。(如果你不同意,请不要与我展开激烈的争论;这不值得争论。):-)我使用了一个引用,添加了一个&after分支和before left()。这非常有效。在这种情况下,此解决方案也更加有效,允许编辑和阅读。尽管此示例是一段外观完全不同的代码的简化版本。