我有一个班级foo
:
class foo{
public:
int i;
};
课程bar
:
class bar{
public:
foo* foo_;
};
代码类似于:
int i=0;
vector<bar*> fs;
while(i<100){
foo f;
f.i = i;
bar* b = new bar;
b->foo_ = &f;
fs.push_back(b);
i++;
}
我希望每个bar->foo_
引用不同的foo
,所以当我有:{/ p>
for(i=0;i<fs.size();i++){
cout << (fs[i]->foo_->i) << "\n";
}
我希望程序打印数字0到99,但是当我运行代码时,我会看到100行99!
为什么所有指针都指向最后一个对象?
答案 0 :(得分:6)
你的foo f;
在技术上都是死的,当循环的当前迭代结束时,它们会超出范围。
你的指针是最后一个对象的原因是因为在下面的迭代中分配的f
似乎总是覆盖前一个,但你不能依赖它。你正在做的是导致未定义的行为。
答案 1 :(得分:3)
您的代码正在处理并存储本地变量f
的地址。
这是禁忌。
在每次迭代时,变量都将被销毁,你的类将指向一个死对象。
程序在执行代码时不会产生运行时错误,因为C ++设计理念是程序员永远不会这样做,所以检查它是浪费时间。
当你犯这种错误时会发生什么是“未定义的行为”,在这种情况下可能发生的最糟糕的事情是该程序显然似乎仍在工作(只是为了稍后再咬你)。
答案 2 :(得分:3)
在你的循环中,foo f
的生命周期太短,无法作为参考用户,你应该将其声明为指针
...
foo *f = new foo();
f->i = i;
bar* b = new bar;
b->foo_ = f;
...