C++ 如何创建将引发堆栈溢出异常的无止境递归?

C++ 如何创建将引发堆栈溢出异常的无止境递归?,c++,exception,stack,stack-overflow,callstack,C++,Exception,Stack,Stack Overflow,Callstack,我正在尝试使用以下程序创建堆栈溢出运行时异常: void f(int a) { cout << a << ", "; f(++a); } int main () { f(0); return 0; } void f(int a){ 库特 是的,这是堆栈溢出。您收到的错误消息取决于平台——因此,如果您在不同类型的计算机上运行它,您可能会看到“堆栈溢出” 没有一个好的可移植的方法可以做到这一点,因为你不会得到抛出的异常,你会让操作系统以它想要的任何方式杀死

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

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

int main () {
  f(0);
  return 0;
}
void f(int a){
库特
  • 是的,这是堆栈溢出。您收到的错误消息取决于平台——因此,如果您在不同类型的计算机上运行它,您可能会看到“堆栈溢出”
  • 没有一个好的可移植的方法可以做到这一点,因为你不会得到抛出的异常,你会让操作系统以它想要的任何方式杀死你的进程
  • 堆栈限制远小于可用内存(堆栈通常为8-20MB)。在特定操作系统设置中,如果确实需要更大的限制,可以重新配置此值(Solaris上的ulimit-s 100000将其设置为100MB)。但通常达到堆栈限制意味着您做错了。较小的堆栈限制有助于操作系统使用虚拟内存分配方案,并且是堆栈溢出的早期错误捕获器(想象一下,您的代码的较慢版本在一两个小时内消耗了所有可用内存……对于其他运行的代码来说,这并不有趣)
  • 这可以是OS或编译器依赖的,并不是固有地被C++烧烤的。尝试各种方法来确定堆栈大小。
    <>这些都是实现细节。从技术上讲,C++实现不需要有堆栈,它只需要自动存储。至少有一个C实现在堆中使用链表(嗯,从我理解的,是一个奇怪的系统)来进行自动存储。 但是,通常情况下,堆栈是一个连续的内存地址空间区域,进程只保留用于存储自动变量和调用帧。它必须在发生任何其他事情之前保留,因为它必须是连续的,如果某些内存块被分配用于其他用途,堆栈将无法增长。

    如果你想为堆栈使用整个内存地址空间,那么堆(也称为空闲存储)就没有空间了

    1 MB是将堆栈设置为的传统值:几乎没有程序真正需要更多,甚至可以适度避免将大量数据放在堆栈上。在多线程环境中,每个线程都有自己的堆栈:因此保持堆栈较小也会使线程更便宜。现代系统可能会将其设置为较大,因为它们有大量地址每个进程的空间

    在64位系统上,为堆栈使用50位地址空间相对容易(比您的计算机目前能够处理的还要多:谷歌数据中心处理PB)。但这样做的缺点是,只有在整个系统的虚拟内存被一个进程占用后,您才会在调试时耗尽堆栈。这样做的好处并不那么大

    栈的大小是实现定义的,而不是由C++标准公开的。请参阅编译器文档,以确定它的大小,以及如何更改其大小。


    <> P> C++标准并没有规定当你吹栈时会发生什么。一般来说,当堆栈被炸掉时,你可能会遇到严重的麻烦:编写代码,这样它就不会发生,而不是在发生之后就发生了。

    不知道用堆链接列表来实现它的堆栈的C实现。如果我误解了你或没有,但2^50不是那么大(它只是一个PB)…耶,我偏离了几个数量级。哎呀!