什么时候在c中释放内存?

Dan*_*yla 4 c memory-management

我试图找出用于c中的变量的内存何时被释放.举个例子,什么时候i在下面的代码片段中释放整数?

int function()
{
  int i = 1;
  // do some things
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*ter 9

在C中,与所有其他语言一样,词法范围的变量(例如i此处)仅在其范围内有效 - 范围i来自其声明到函数的右括号.当它们被释放时,通常没有指定,但在实际的C实现中,局部变量在调用堆栈上分配,并且一旦函数返回它们的内存就会被重用.

考虑类似的事情

int function()
{
    int i; // beginning of i's scope
    {
        int j; // beginning of j's scope
        ...
    } // end of j's scope
    {
        int k; // beginning of k's scope
        ...
    } // end of k's scope

    return 0; // all locals of the function are deallocated by the time it is exited
} // end of i's scope
Run Code Online (Sandbox Code Playgroud)

范围确定何时可以通过名称访问auto变量,并且对于local()变量,何时可以有效地访问其内容(例如,如果设置指向局部变量的地址的指针,则取消引用变量范围外的指针是未定义的行为).解除分配是一个有点不同的问题......大多数实现在j或k的范围结束时都不会做任何事情来"解除分配"它们,尽管它们可能会为这两个变量重用相同的内存.当function返回时,大多数实现"啪"的所有当地人出栈,与返回地址一起,通过堆栈指针的单递减,实际上"重新分配"他们的记忆......虽然记忆依然在那里堆栈上,准备"分配"

请注意,您的问题的术语有些混淆......变量具有范围,但它是分配和释放的内存,而不是变量.有些变量甚至可能没有为它们分配任何内存,例如,它们是常量或从未在程序中使用过.并且如上所述仅分配或释放局部变量的内存...静态和文件范围变量的内存永远不会被释放,并且仅在加载程序时分配.还有其他内存 - 堆内存 - 由程序显式分配和释放(通过调用malloc/realloc/calloc/strdup/free等).但是虽然可以引用堆内存 通过指针变量,指针变量本身的内存只包含引用(内存地址),变量具有本地或静态/文件范围.

  • 到目前为止,不知何故,这是唯一确切的答案。因为它指出了范围(给出对象的生命周期)和对象的释放之间的区别。 (2认同)

Dav*_*rtz 7

当它超出范围时,它将被释放.由于它具有函数范围,因此在函数返回时会发生这种情况.