是否需要在函数内释放动态指针?

时间:2011-11-17 19:12:07

标签: c function pointers dynamic malloc

我在互联网上阅读了有关此内容的相互矛盾的信息。据我所知,函数中的所有变量仅存在于函数的生命周期中,因此这不是必需的。但是对于动态指针数组,我不确定。

由于

4 个答案:

答案 0 :(得分:4)

你没有自由指针 - 它们会自动清理。你需要释放的是malloc获得的内存。您可以使用指针访问该内存。

答案 1 :(得分:1)

简洁地说:从malloc获得的每个指针都必须准确转到free一次。没什么,没什么。

答案 2 :(得分:1)

它取决于指针引用的内存的分配位置。 从根本上说有两种在C中分配空间的方法。

  1. 使用堆栈:

    void foo(){
        int stack_variable = 10;
        int *stack_pointer = &stack_variable; //bar shouldn't be freed.
    }
    
  2. 使用堆:

    void foo(){
    
       int * heap_pointer = (int *) malloc(sizeof(int)); //heap_pointer need to be freed somewhere
    
    }
    
  3. 在第一种情况下没有问题:当函数返回时,将释放堆栈中分配的内存。即使您使用指针,并指向堆栈中的某些数据,也不需要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)的范围限制。 因此,您可以在需要时而不是提前为数据分配内存,从而动态内存。

如果我们没有这种能力,我们必须知道在编译时我们将使用多少内存空间。

希望这能清除一些问号。