gpt4 book ai didi

c++ - std::vector 中止问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:53:09 25 4
gpt4 key购买 nike

我在下面的例子中遇到了困难,最后一行产生了“abort has been 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
}

最佳答案

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

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

关于c++ - std::vector 中止问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com