【发布时间】:2015-06-22 11:39:11
【问题描述】:
假设下面的代码,
int* foo(){
int a=5;
return &a;
}
int main(){
int* b=foo();
std::cout<<*b<<std::endl;
return 0;
}
我对这个程序的理解是 a 的生命周期只在 foo 中。 foo() 完成后, a 应该是无效的。但由于没有函数覆盖该堆栈块,它仍然打印 5。如果这是错误的,请纠正我。
如果上面是对的,我的问题是,我调用了std::cout
【问题讨论】:
-
您的问题是关于
a,而不是iostream. -
编译器甚至可能懒得返回
&a,因为它无论如何都是不可用的。这似乎违反直觉。毕竟是你写的。但是许多 C++ 编译器通过删除对正确结果没有贡献的语句来优化生成的二进制文件。这样的优化器并不神奇,它们需要规则来确定哪些语句可以安全删除。这些规则可能会对像这样的损坏程序产生相当意想不到的结果。
标签: c++ memory stream stack iostream