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

标签 c memory-management

我试图找出何时释放用于 c 中的变量的内存。例如,以下代码片段中的整数 i 何时会被释放?

int function()
{
  int i = 1;
  // do some things
  return 0;
}

最佳答案

在 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

作用域确定何时可以通过名称访问变量,对于本地 (auto) 变量,何时可以有效访问其内容(例如,如果您将指针设置为本地地址变量,取消引用变量范围外的指针是未定义的行为)。释放是一个有点不同的事情......大多数实现不会在 j 或 k 的范围结束时做任何事情来“释放”它们,尽管它们可能会为两个变量重用相同的内存。当 function 返回时,大多数实现会将所有局部变量连同返回地址一起“弹出”堆栈,通过堆栈指针的一次递减,实际上是“释放”它们的内存……尽管内存仍然在堆栈上,准备好“分配”给调用的下一个函数。

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

关于c - 什么时候在c中释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16980406/

相关文章:

c - GDB 调试器 : char array type examine and print command

c - 了解 Linux 内核中每个 cpu 的结构

C中的字符问题

iphone - 如何释放 UINavigationController?

Matlab 进程内存泄漏超过 16 天

objective-c - 带有 kCCHmacAlgSHA1 的 CCHmac 输出长度不一致

c - 与运算符的整数提升 <<

ios - 从 NSMutableStrings 循环填充 NSMutableArray 时应用程序崩溃

linux - __get_free_page,物理地址和交换

c++ - 这种类型的内存管理有用例吗?