我正在尝试使用以下程序创建堆栈溢出运行时异常:

void f(int a) {
  cout << a << ", ";
  f(++a);
}

int main () {
  f(0);
  return 0;
}

当我运行此程序时,我的计算机运行大约261824 call stack,然后发生command terminated运行时错误。现在我想知道:
  • 这是堆栈溢出的一个好例子吗?如果是,为什么会发生command terminated错误?
  • 我如何trycatch堆栈溢出异常?
  • 我有很多可用内存;为什么我的堆栈不占用我所有的内存?
  • 如何确定与call stack相对应的堆栈大小?
  • 最佳答案

  • 是的,这是堆栈溢出。您收到的错误消息取决于平台-因此,如果在其他类型的计算机上运行它,则可能会看到“堆栈溢出”。
  • 没有像seen here这样好的可移植方法。这是因为没有引发异常,而是让OS以所需的任何方式终止进程。
  • 您的堆栈限制比可用内存小得多(堆栈通常为8-20MB)。在特定的操作系统设置上,如果确实需要更大的值,则可以重新配置该值(Solaris上的ulimit -s 100000将其设置为100MB)。但是通常达到堆栈限制意味着您做错了事。较小的堆栈限制有助于操作系统使用虚拟内存分配方案,并且是堆栈溢出的早期错误捕获器(镜像的代码较慢版本占用一两个小时内的所有可用内存...对于正在运行的其他任何内容都不那么有趣)。
  • 这可能取决于OS或编译器,并不是C++固有的特性。尝试使用this SO link来确定堆栈大小的各种方法。
  • 09-30 14:36
    查看更多