我正在尝试使用以下程序创建堆栈溢出运行时异常:
void f(int a) {
cout << a << ", ";
f(++a);
}
int main () {
f(0);
return 0;
}
当我运行此程序时,我的计算机运行大约261824 call stack
,然后发生command terminated
运行时错误。现在我想知道:
这是堆栈溢出的一个好例子吗?如果是,为什么会发生command terminated
错误? 我如何try
和catch
堆栈溢出异常? 我有很多可用内存;为什么我的堆栈不占用我所有的内存? 如何确定与call stack
相对应的堆栈大小? 是的,这是堆栈溢出。您收到的错误消息取决于平台-因此,如果在其他类型的计算机上运行它,则可能会看到“堆栈溢出”。 没有像seen here这样好的可移植方法。这是因为没有引发异常,而是让OS以所需的任何方式终止进程。 您的堆栈限制比可用内存小得多(堆栈通常为8-20MB)。在特定的操作系统设置上,如果确实需要更大的值,则可以重新配置该值(Solaris上的ulimit -s 100000将其设置为100MB)。但是通常达到堆栈限制意味着您做错了事。较小的堆栈限制有助于操作系统使用虚拟内存分配方案,并且是堆栈溢出的早期错误捕获器(镜像的代码较慢版本占用一两个小时内的所有可用内存...对于正在运行的其他任何内容都不那么有趣)。 这可能取决于OS或编译器,并不是C++固有的特性。尝试使用this SO link来确定堆栈大小的各种方法。