运行时堆栈溢出

Str*_*tra 3 c++

如果编译器在运行前计算出需要的栈大小,那么栈溢出是怎么发生的呢?在编译时,编译器是否计算整个程序堆栈所需的内存总量?

Jen*_*nsG 5

考虑这个非常简化的示例函数(伪代码)

 void Foobar(long nested) {
    if( --nested >= 0)
        Foobar(nested);
 }
Run Code Online (Sandbox Code Playgroud)

每次调用(至少)将返回地址压入堆栈。

问题:你需要多少内存?

确切地。这就是原因。


for*_*818 5

不。

编译器只能知道在运行时发生了什么非常有限的扩展。例如,它无法判断执行以下函数需要多少堆栈:

void foo() {
    int x = 0;
    std::cin >> x;
    if (x == 42) foo();
}
Run Code Online (Sandbox Code Playgroud)

Stack 是一种有限的资源,如果超过它,就会出现 stackoverflow。