Dan*_*yla 4 c memory-management
我试图找出用于c中的变量的内存何时被释放.举个例子,什么时候i在下面的代码片段中释放整数?
int function()
{
int i = 1;
// do some things
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在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等).但是虽然可以引用堆内存 通过指针变量,指针变量本身的内存只包含引用(内存地址),变量具有本地或静态/文件范围.