我知道在c之类的语言中我需要在分配后释放内存。 (我来自java),对此我有几个问题:
我正在做的事情:
int array[30];
(即创建一个大小为30的整数数组)与此相同 在做什么?
int array[] = malloc(sizeof(int)*30);
作为第一个问题的序列,当我创建数组时 在函数内部(即函数的本地而不是函数的全局) 整个文件),我是否需要为这个数组释放内存 我创建它的功能? (我没有看到任何其他方式 释放它,因为我无法传递创建的所有数组的引用 main()函数)。
简而言之,我想知道我何时需要为创建的对象/基元(在函数内部或外部)释放内存。
答案 0 :(得分:5)
如果你说
int array[30];
这是在堆栈上,当它超出范围时会自动清理。
如果你说
int * array = (int *)malloc(sizeof(int)*30);
内存将在免费商店(堆)上分配,并且您负责释放它
free(array);
无论代码是函数调用内部还是主函数,都同样适用。
如果您使用malloc
,则需要使用free
。
答案 1 :(得分:4)
不,它根本不相同。
第一个使用“自动分配”保留内存,通常在堆栈上。一旦对象超出范围,该内存将自动解除分配,例如在函数返回时。
第二个使用malloc()
在堆上分配内存;
free()
取消分配此内存。
另外,正确的语法是:
int *array = malloc(30 * sizeof *int);
你不能在C中使用[]
。
答案 2 :(得分:0)
如果使用int array[30]
,则在堆栈上分配数组,它仅存在于创建的范围内。
如果您使用malloc
,则必须使用free
手动释放内存。
两种方法都不同,并满足不同的需求。堆栈分配的变量/对象具有有限的范围,而您可以使用超出本地范围的malloc
个对象。
使用带有指针的malloc
:
int *array = malloc(sizeof(int)*30);
答案 3 :(得分:0)
当int array[30]
超出范围时,您的数组array
将被放入堆栈并且其分配内存将自动释放。但是,当您使用malloc/calloc/realloc
分配内存时,您需要明确free
此内存。
答案 4 :(得分:0)
基本上malloc
在堆中分配内存,在丢失范围后不会被释放。因此,应使用malloc
释放使用free
分配的内存。