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

标签 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

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

最佳答案

可用于递归的内存量取决于编译器设置、操作系统和物理平台。没有最小或最大限制。

当内存不足时,会打印出各种错误,一种常见的消息是“Segmentation fault”。

Also why does it print Segmentation fault?

Isn't that a message only printed when memory is accessed in unauthorized ways?

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

关于c++ - C++ 程序的最大堆栈级别是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308665/

相关文章:

c++ - OpenThread() 返回 NULL Win32

c++ - 设置窗口像素的正确(无闪烁)方式?

c# - 在 C# 应用程序中只能使用 C++ DLL 中的 1/4 函数

javascript - 使用递归、Ramda.js 和无点风格重构字符串的 getPermutations()

haskell - 为什么这个 Haskell 代码会产生堆栈溢出?

.net-core - ASP.NET Core 2.1 - 与依赖注入(inject)相关的堆栈溢出异常

c - 如何重写以下函数,使其不再容易受到堆栈缓冲区溢出的影响?

C++ - 在 HDF5 中设置列​​名

.net - 检查函数是否在递归函数调用中

string - 递归查找文件中的文本 (PowerShell)