如果我有以下代码:
void bar(){
int x = 1;
foo();
}
void foo(){
while(true);
}
Run Code Online (Sandbox Code Playgroud)
调用when时int x使用的内存会发生什么变化?它被释放了吗?我知道如果函数返回则释放内存,但是在这种情况下函数根本不会返回.bar()foo()
如果我使用这个代码,其中bar调用foo,反过来,调用bar等等,程序最终会耗尽内存,还是新的函数实例会被新代码替换?
void bar(){
int x = 1;
foo();
}
void foo(){
int y = 1;
bar();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
在这种情况下,x被分配在堆栈上.当你调用函数foo()时,存储在堆栈中的所有变量都保持分配 - 新函数使用新的堆栈'frame'.这是必需的,因为如果您的函数foo()曾经返回,那么它需要能够访问旧堆栈帧上的变量'x'.如果新函数(foo)调用另一个函数,那么两者仍然会消耗它们的堆栈内存.如果foo以递归方式调用foo,则每个递归调用都会有一个新的'foo'堆栈帧(以及为变量y分配的堆栈空间).如果有太多的函数调用占用过多的堆栈空间(递归或不递送),最终会耗尽堆栈空间,程序将失败.