我试着看看在通过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
?
这是不是只在未经授权的方式访问内存时打印的消息?
答案 0 :(得分:5)
可用于递归的内存量取决于编译器设置,操作系统和物理平台。没有最低限度或最高限额。
当内存不足时,可以打印各种错误,一条常见消息是&#34;分段错误。&#34;
为什么还会打印分段错误?
在未经授权的方式访问内存时,是否仅打印了一条消息?
您的程序通过要求比可用内存更多的内存或访问程序范围(分配)之外的内存以未经授权的方式访问内存,因此操作系统很好并且显示分段错误 。您的操作系统可能已经破坏了您的计算机或挂起或重新启动。某些平台显示蓝屏死机。
答案 1 :(得分:2)
如果Lua函数的内存权重比C ++函数小,我会感到惊讶。
您假设Lua正在使用C ++堆栈进行Lua函数调用。
不是。 Lua有自己的功能堆栈,有自己的限制。就像Lua有自己的存储空间(由主持人提供)等等。
C ++堆栈的局限性取决于实现,无法先验确定。
是否仅在未经授权的方式访问内存时才打印消息?
是。这就是你做的。您试图访问的堆栈空间比分配的数量多。这是访问您尚未被授权访问的内存。
答案 2 :(得分:0)
您所询问的是非常依赖于实现的。这有很多因素依赖于它,主要是编译器可用的可用计算机内存,这在计算机之间差别很大。当然,没有单一的标准,但您目前得到的错误Segmentation Fault
是可能出现的许多错误之一。有些编译器甚至会打印Stack Overflow
。