【发布时间】:2018-11-19 07:40:49
【问题描述】:
我试图了解释放堆栈分配对象的行为方式。准确地说,我试图在标准(N1570)中找到解释。考虑以下简单函数:
void foo(){
char test[4096];
test[10] = 0;
}
这里test 数组将在foo 退出时被释放。在objdump 中很容易看到test 分配在堆栈上。标准(强调我的)规定:
一个对象,其标识符被声明为没有链接,也没有 存储类说明符 static 具有自动存储持续时间,同样如此 一些复合文字。
所以test 具有自动存储期限。我们可以很容易地改写函数如下:
void test(){
char *test= malloc(4096 * sizeof(char));
test[10] = 0;
free(test);
}
但我们必须自己解除分配,而test 仍然有自动存储时长。
问题:标准如何规定char test[4096] 将在函数退出时被释放?标准没有声明test 是在堆栈上分配的,它是由实现定义的。
【问题讨论】:
-
标准没有指定它被释放,只是内存变得无效。
-
在第二种情况下,您分配的是 指向 char 的指针,而不是数组的内存。数组和指针不是一回事。因此,在您的情况下,唯一具有自动存储功能的变量是指针
test,它将在函数退出时被释放。malloc分配的内存是从堆中获取的,是永久内存(直到没有被显式释放)。
标签: c arrays memory-management