如果我有类似的话:
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?
}
我对指针仍然不是很有经验,似乎我创建了一个额外的指针,但它只是指向列表中的一个位置,所以我不应该释放它,它会在函数结束时被清除?
顺便说一下,我这样定义了DLL
和DLL_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字节。不确定这究竟意味着什么,或者它是否相关。
答案 0 :(得分:5)
调用free
不会释放指针,它会释放指针所指向的内容。简单地声明和使用指针不会要求释放,因此您不需要释放用于遍历列表的指针。
一般规则是,您需要在free
/ malloc
/ calloc
返回给您的所有内容上致电realloc
。每个分配的块只需要调用一次free
。将相同的块释放两次会导致未定义的行为。
答案 1 :(得分:1)
要添加@dasblinkenlight所说的内容,您无需显式删除/删除它。由于* temp在函数范围内,因此一旦函数返回它就会消失。
由于你担心未使用的内存,只需提醒一下 - 指针在32位机器上占用4个字节,在64位机器上占用8个字节,而不是你可能想到的sizeof(DLL_Node)。