我希望程序打印数字0到99,但是当我运行代码时,我看到100行99

时间:2013-09-29 20:29:15

标签: c++ object pointers

我有一个班级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!

为什么所有指针都指向最后一个对象?

3 个答案:

答案 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;
...