2013-09-28 48 views
7

我有以下struct我是否需要释放局部变量?

typedef struct cell Cell; 
struct cell { 
    int value; 
    int *nextcell; 
}; 

而且我有以下函数来释放一个链表:

void freelist(Cell *beginning) 
{ 
    Cell *thisCell = beginning; 
    Cell *NextCell = beginning->nextcell; 

    while (thisCell != NULL) 
    { 
     NextCell = thisCell->nextcell; 
     free(thisCell); 
     thisCell = NextCell; 
    } 

    /* Here comes my question. Do I need to free the following variables? */ 
    free(beginnig); 
    free(thisCell); 
    free(NextCell); 
} 
+6

你不释放变量,你释放内存。经验法则:每个malloc(或者realloc)一个免费。 –

回答

7

不,释放意为动态分配的内存,指针只是一个指向那里的变量。你的循环释放了列表中所有的内存 - 在这一点上没有任何东西可以释放,并试图再次释放相同的内存(开始)会导致错误。 thisCell在循环为NULL之后,那里甚至没有东西可以在那里释放。

如果你指的是指针本身,它们不会动态地分配内存,当你定义它们时,它们每个都在堆栈上占用一个槽位,并且离开该功能将释放该槽位。这里我们只讨论指针本身(它们指向的地址被存储的地方),而不是它们可能容纳的尖端内存。

+0

这个男人,这回答我的问题! =) –

+0

检查这是否为真的最佳方法是尝试将free()应用于存储在堆栈上的变量并查看会发生什么。 :) – rbaleksandar

2

无论指针存储在哪里,您都可以释放内存 - 在局部变量中,在全局/静态变量中,或者在免费存储区本身分配的指针中。你的函数可以多次释放几个指针:你不需要在你的函数底部释放三个调用中的任何一个(尽管第二个调用是无害的,因为它传递NULL来释放,这总是OK)。

相关问题