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

I expect the program prints the numbers 0 to 99, but when I run the code I see 100 lines of 99

本文关键字:代码 运行 我看 打印 程序 数字 我希望      更新时间:2023-10-16

我有一个类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,所以当我有:

 for(i=0;i<fs.size();i++){
     cout << (fs[i]->foo_->i) << "n";
 }

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

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

您的foo f;在技术上都是死的,当循环的当前迭代结束时,它们将超出范围。

指针全部指向最后一个对象的原因是,在后续迭代中分配的f似乎总是覆盖前一个对象,但您也不能依赖它。你正在做的事情会导致未定义的行为。

在你的循环中,foo f的生存期太短,无法作为用户作为参考,你应该把它声明为一个指针

...
foo *f = new foo();
f->i = i;
bar* b = new bar;
b->foo_ = f;
...

您的代码正在获取并存储局部变量的地址f

这是不行的。

在每次迭代中,变量将被销毁,您的类将指向一个死对象。

该程序在执行代码时不会给出运行时错误C++因为设计理念是程序员永远不会这样做,因此检查它是浪费时间。

当你犯这种错误时发生的事情是"未定义的行为",在这种情况下可能发生的最糟糕的事情是程序显然似乎无论如何都在工作(只是为了稍后咬你)。