当函数调用另一个函数时,函数使用的内存会发生什么变化?

Div*_*ero 2 c c++ memory

如果我有以下代码:

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分配的堆栈空间).如果有太多的函数调用占用过多的堆栈空间(递归或不递送),最终会耗尽堆栈空间,程序将失败.

  • 这个答案解释了常见的实现.对于具有自动存储持续时间的对象,C++语言不强制使用堆栈(除了不相关的[std :: stack](http://en.cppreference.com/w/cpp/container/stack)容器类模板) . (4认同)