我应该释放用于遍历链表的临时指针吗?

时间:2016-07-09 21:04:18

标签: c pointers free doubly-linked-list

如果我有类似的话:

function(DLL *dll) {
    DLL_Node *temp = dll->head

    // do stuff with temp like traverse list with temp=temp->next

    // say when done, temp = dll->tail, should I free(temp) or leave it alone?
}

我对指针仍然不是很有经验,似乎我创建了一个额外的指针,但它只是指向列表中的一个位置,所以我不应该释放它,它会在函数结束时被清除?

顺便说一下,我这样定义了DLLDLL_Node

typedef struct dll_node {
    int data;
    struct dll_node *prev;
    struct dll_node *next;
} DLL_Node;

typedef struct DLL_ {
    int count;
    DLL_Node *head;
    DLL_Node *tail;
} DLL;

我看到了程序valgrind的建议,用于测试内存泄漏,它表示肯定丢失和间接丢失都是0字节,但可能丢失的是2,064字节。不确定这究竟意味着什么,或者它是否相关。

2 个答案:

答案 0 :(得分:5)

调用free不会释放指针,它会释放指针所指向的内容。简单地声明和使用指针不会要求释放,因此您不需要释放用于遍历列表的指针。

一般规则是,您需要在free / malloc / calloc返回给您的所有内容上致电realloc。每个分配的块只需要调用一次free。将相同的块释放两次会导致未定义的行为

答案 1 :(得分:1)

要添加@dasblinkenlight所说的内容,您无需显式删除/删除它。由于* temp在函数范围内,因此一旦函数返回它就会消失。

由于你担心未使用的内存,只需提醒一下 - 指针在32位机器上占用4个字节,在64位机器上占用8个字节,而不是你可能想到的sizeof(DLL_Node)。