【发布时间】:2017-01-11 12:43:19
【问题描述】:
我试图看看在 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?
那不是只有在未经授权的方式访问内存时才打印消息吗?
【问题讨论】:
-
这是定义的实现
-
这严重依赖于系统。
-
内存不足应该打印什么错误?可能是分段错误?
-
@GillBates 它甚至不是实现定义的。实现不需要记录递归限制。
-
当系统的堆栈空间用完时,您会以“未经授权的方式”访问超出它的内存,因此会出现消息。 Lua 的调用栈由 Lua 运行时管理,完全独立。
标签: c++ recursion stack-overflow