C++标准对堆栈溢出有什么看法?

Bja*_*une 11 c++ stack-overflow undefined-behavior

我看了一下C++ 0x标准草案,据我所知,堆栈溢出没有任何内容.搜索"堆栈溢出"不会产生任何结果,并且搜索"堆栈"我只获得了堆栈展开和std :: stack的引用.这是否意味着没有符合C++标准的实现,因为当本地对象(例如巨大的本地数组)耗尽内存时,没有机制允许处理错误?

这个问题的答案表明,至少C标准没有提到堆栈溢出.

要使问题具体,请考虑此计划

// Program A
int identity(int a) {
  if (a == 0)
    return 0;
  char hugeArray[1024 * 1024 * 1024]; // 1 GB
  return identity(a - 1) + 1;
}
int main() {
  return f(1024 * 1024 * 1024);
}
Run Code Online (Sandbox Code Playgroud)

和这个程序

// program B
int main() {
  return 1024 * 1024 * 1024;
}
Run Code Online (Sandbox Code Playgroud)

我认为C++标准不允许任何C++实现在这两个程序上做一些明显不同的事情.实际上程序A不会在任何现代机器上运行,因为它在堆栈上分配了一个exabyte内存(想象一下该函数实际上使用了巨大的数组,因此编译器无法以静默方式将其删除而不会产生不良影响).C++标准是否允许程序A失败?

编辑:问题不在于标准是否应该定义堆栈溢出会发生什么,问题是它说什么,如果有的话.

tem*_*def 14

我不确定这是否是您正在寻找的,但在C++ 03 ISO标准的附录B中,有以下注意事项:

  1. 由于计算机是有限的,因此C++实现不可避免地受限于它们可以成功处理的程序的大小.每个实施都应记录已知的限制.本文档可引用存在的固定限制,说明如何根据可用资源计算变量限制,或者说固定限制不存在或未知.
  2. 限制可能会限制包括下面描述的数量或其他数量的数量.

(我强调)我认为这意味着编译器允许其中一个函数在另一个函数失败的情况下工作是完全合法的,前提是编译器说明了适用的限制以及如何根据系统可用的资源计算它们.

  • 顺便说一句,标准没有"堆栈溢出"概念的事实允许编译器执行积极的尾调用优化.(参见http://stackoverflow.com/questions/5493688/stack-overflow-error-or-exception/) (2认同)