ala*_*ere 0 c++ vector abort stdvector
我正在考虑下面的例子,最后一行产生了一个"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
}
Run Code Online (Sandbox Code Playgroud)
此代码的问题是trunk.left()返回分支的副本,而不是对分支的引用.因此,您的focus3指针指向一个临时对象,该对象在该行代码完成执行后立即被清除.因此,当您尝试focus3在最后一行解除引用时,您将跟随指向垃圾数据的指针,这会导致崩溃.
要解决此问题,要么left返回对分支的引用,要么创建focus3一个const引用,这会将临时的生命周期延长到引用的生命周期.
| 归档时间: |
|
| 查看次数: |
1425 次 |
| 最近记录: |