【问题标题】:I expect the program prints the numbers 0 to 99, but when I run the code I see 100 lines of 99我希望程序打印数字 0 到 99,但是当我运行代码时,我看到 100 行 99
【发布时间】:2013-09-29 20:29:14
【问题描述】:

我有一堂课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-&gt;foo_ 引用不同的foo,所以当我有时:

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

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

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

【问题讨论】:

  • 你为什么期望 99?您编写的代码应该返回 100 行。
  • 尝试让 foo 也成为指针 foo* f = new f
  • f 在 while 的每次迭代结束后不再可用。您正在保存“死”对象的地址。我认为这是未定义的行为

标签: c++ object pointers


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在您的循环中,foo f 的生命周期太短,无法供用户参考,您应该将其声明为指针

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

    【讨论】:

      【解决方案3】:

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

      这是一个禁忌。

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        • 2014-04-20
        • 2019-05-06
        相关资源
        最近更新 更多