为什么不能在堆栈上释放变量?

dfg*_*dfg 3 c c++ memory heap stack

有问题的语言是C/C++.

我的教授说当你完成使用它时释放堆上的内存,因为否则你最终会得到无法访问的内存.这样做的问题是你可能最终耗尽了所有内存,而且你无法访问它们.

为什么相同的概念不适用于堆栈?我知道你总是可以访问你在堆栈中使用的内存,但如果你不断创建新的变量,你最终会用完空间吗?那么为什么你不能在堆栈上释放变量来为堆上的新变量腾出空间呢?

我得到编译器释放堆栈上的变量,但那是在变量范围的末尾.它是否也在其范围的末尾释放堆上的变量?如果没有,为什么不呢?

Ker*_* SB 7

动态分配的对象(通俗语言中的"堆对象")永远不是变量.因此,它们永远不会超出范围.他们不住在任何范围内.您可以处理它们的唯一方法是通过分配时获得的指针.

(指针通常分配给变量,但这没有帮助.)

重复:变量有范围; 对象没有.但是很多对象都是变量.

并回答这个问题:你只能释放对象,而不是变量.

  • 要真正迂腐,范围是*姓*.变量是命名对象,但它是具有范围而不是对象的名称.但是,对于自动变量,对象的生命周期与名称的范围相同,这就是为什么讨论变量的"范围"是有意义的,即使它恰当地是名称的范围. (3认同)

小智 6

闭合的“}”大括号的末尾是堆栈“释放”其内存的地方。所以如果我有:

{
    int a = 1;
    int b = 2;

    {
        int c = 3; // c gets "freed" at this "}" - the stack shrinks
                   // and c is no longer on the stack.
    }
}                  // a and b are "freed" from the stack at this last "}".
Run Code Online (Sandbox Code Playgroud)

您可以将 c 视为在堆栈上比“a”和“b”“更高”,因此 c 在它们之前弹出。因此,每次写入“}”符号时,您都在有效地缩小堆栈并“释放”数据。


Mio*_*ios 0

了解函数调用 - 每次调用都会将数据和函数地址推送到堆栈上。函数从堆栈中弹出数据并最终推送其结果。

一般来说,堆栈由操作系统管理,是的 - 它可能会被耗尽。尝试做这样的事情:

int main(int argc, char **argv)
     {
     int table[1000000000];
     return 0;
     }
Run Code Online (Sandbox Code Playgroud)

这应该足够快地结束。