gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:11:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com