我在互联网上阅读了有关此内容的相互矛盾的信息。据我所知,函数中的所有变量仅存在于函数的生命周期中,因此这不是必需的。但是对于动态指针数组,我不确定。
由于
答案 0 :(得分:4)
你没有自由指针 - 它们会自动清理。你需要释放的是malloc获得的内存。您可以使用指针访问该内存。
答案 1 :(得分:1)
简洁地说:从malloc
获得的每个指针都必须准确转到free
一次。没什么,没什么。
答案 2 :(得分:1)
它取决于指针引用的内存的分配位置。 从根本上说有两种在C中分配空间的方法。
使用堆栈:
void foo(){
int stack_variable = 10;
int *stack_pointer = &stack_variable; //bar shouldn't be freed.
}
使用堆:
void foo(){
int * heap_pointer = (int *) malloc(sizeof(int)); //heap_pointer need to be freed somewhere
}
在第一种情况下没有问题:当函数返回时,将释放堆栈中分配的内存。即使您使用指针,并指向堆栈中的某些数据,也不需要free。当数据本身超出范围时,请注意不要使用指向堆栈中分配的数据的指针:
int * foo(){
int stack_variable = 10;
int *ptr = &stack_variable;
return ptr;
}
int * ptr = foo(); // you have a problem here: ptr points to a memory region that no longer exist!
在第二种情况下,您正在使用堆,因此您需要在某处使用free,以显式释放它。
答案 3 :(得分:0)
如果您使用malloc / calloc分配了数据,则需要释放数据。
由于@Julia Childe的好奇评论而增加:
好吧,分配动态内存的关键在于它会一直存在,直到你明确释放它为止。这使您能够从函数和函数传递指针,并且您不受特定函数(即main)的范围限制。 因此,您可以在需要时而不是提前为数据分配内存,从而动态内存。
如果我们没有这种能力,我们必须知道在编译时我们将使用多少内存空间。
希望这能清除一些问号。