C ++程序的最大堆栈级别是多少?

时间:2016-09-03 15:44:25

标签: c++ recursion stack-overflow

我试着看看在通过C ++中的递归获得堆栈溢出之前我能走多远。我写了这个函数

long recurse( long level ) {
    std::cout << level << std::endl;
    return recurse( ++level ) * 12 //to avoid tail recursion optimization, if present
}

我称之为传递0作为第一个值。它打印的最后一个数字是349411,然后打印Segmentation fault并停止运行。我的猜测是内存不足,但是在Lua中抛出stack overflow错误之前,使用相同值调用的相同函数打印499982,如果Lua函数的内存权重比C ++函数小,我会感到惊讶

那么C ++程序在停止执行之前可以获得的最大堆栈级别是多少?

它真的“直到它有记忆”,还是有固定的限制?

为什么要打印Segmentation fault

这是不是只在未经授权的方式访问内存时打印的消息?

3 个答案:

答案 0 :(得分:5)

可用于递归的内存量取决于编译器设置,操作系统和物理平台。没有最低限度或最高限额。

当内存不足时,可以打印各种错误,一条常见消息是&#34;分段错误。&#34;

  

为什么还会打印分段错误?

     

在未经授权的方式访问内存时,是否仅打印了一条消息?

您的程序通过要求比可用内存更多的内存或访问程序范围(分配)之外的内存以未经授权的方式访问内存,因此操作系统很好并且显示分段错误 。您的操作系统可能已经破坏了您的计算机或挂起或重新启动。某些平台显示蓝屏死机

答案 1 :(得分:2)

  

如果Lua函数的内存权重比C ++函数小,我会感到惊讶。

您假设Lua正在使用C ++堆栈进行Lua函数调用。

不是。 Lua有自己的功能堆栈,有自己的限制。就像Lua有自己的存储空间(由主持人提供)等等。

C ++堆栈的局限性取决于实现,无法先验确定。

  

是否仅在未经授权的方式访问内存时才打印消息?

是。这就是你做的。您试图访问的堆栈空间比分配的数量多。这是访问您尚未被授权访问的内存。

答案 2 :(得分:0)

您所询问的是非常依赖于实现的。这有很多因素依赖于它,主要是编译器可用的可用计算机内存,这在计算机之间差别很大。当然,没有单一的标准,但您目前得到的错误Segmentation Fault是可能出现的许多错误之一。有些编译器甚至会打印Stack Overflow