我试图找出何时释放用于 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/