【问题标题】:Does iostream occupy stack space?iostream 是否占用堆栈空间?
【发布时间】: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.
  • 编译器甚至可能懒得返回&amp;a,因为它无论如何都是不可用的。这似乎违反直觉。毕竟是你写的。但是许多 C++ 编译器通过删除对正确结果没有贡献的语句来优化生成的二进制文件。这样的优化器并不神奇,它们需要规则来确定哪些语句可以安全删除。这些规则可能会对像这样的损坏程序产生相当意想不到的结果。

标签: c++ memory stream stack iostream


【解决方案1】:

“但是由于没有函数覆盖该堆栈块”。您不确定这一点:C++ 标准中没有任何内容表明这一点。我可以构建一个符合标准的编译器来覆盖堆栈的那个块。也许我对std::cout 的实现可以做到这一点。

您的程序的行为正式未定义。你不能再说了。

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2010-12-04
    • 2018-08-02
    • 2021-01-10
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2021-09-08
    相关资源
    最近更新 更多