我希望程序打印数字 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
我有一个类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++因为设计理念是程序员永远不会这样做,因此检查它是浪费时间。
当你犯这种错误时发生的事情是"未定义的行为",在这种情况下可能发生的最糟糕的事情是程序显然似乎无论如何都在工作(只是为了稍后咬你)。
相关文章:
- 我的代码运行良好,但在游戏循环中中断
- 通过窗口从C++代码运行 WSL 命令
- 如何使用 lldb 查找我的代码运行的位置
- 无法在 VS Code 上使用代码运行程序运行C++文件
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- Visual Studio代码运行环境
- 如何从C++代码运行自定义 GPU tensorflow::op?
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- 代码运行缓慢
- .NET CORE 2 DLL引用带有C 代码运行时错误
- C++ 中控制台代码运行时的分段错误
- C++ 菜单代码 - 运行另一个类
- 以下代码运行后,如何在程序再次运行之前清除用户声明的变量 empName
- 当我使用此合并排序代码运行时,输出错误
- 有哪些优化技巧可以使我的代码运行得更快
- 使 C 代码能够作为C++代码运行
- 错误代码LNK1561阻止我的代码运行
- 如果我用代码块编译代码,为什么我的代码运行速度更快
- 更改Linux用户从C/C 代码运行时间
- 为什么这段代码运行这么慢