我应该释放一个用于遍历链表的临时指针吗?
Should I free a temp pointer used to traverse a 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?
}
我对指针还不是很有经验,好像我创建了一个额外的指针,但它只是指向列表中的一个位置,所以我不应该释放它,函数结束时它会被清除?
顺便说一句,我这样定义 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字节。不确定这到底意味着什么,或者它是否相关。
调用free
不会释放指针,它会释放指针指向的任何内容。简单地声明和使用指针不会调用释放,因此您不需要释放已用于遍历列表的指针。
一般规则是,您需要对 malloc
/calloc
/realloc
返回给您的所有内容调用 free
。每个分配的块上只需要调用一次 free
。释放同一个块两次导致 未定义的行为。
只需添加@dasblinkenlight 所说的内容,您不需要明确地delete/remove它。由于 *temp 在函数的范围内,一旦函数 returns 它就会消失。
由于您担心未使用的内存,所以提醒一下 - 指针在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,而不是您可能的 sizeof(DLL_Node)思维。
如果我有类似的东西:
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字节。不确定这到底意味着什么,或者它是否相关。
调用free
不会释放指针,它会释放指针指向的任何内容。简单地声明和使用指针不会调用释放,因此您不需要释放已用于遍历列表的指针。
一般规则是,您需要对 malloc
/calloc
/realloc
返回给您的所有内容调用 free
。每个分配的块上只需要调用一次 free
。释放同一个块两次导致 未定义的行为。
只需添加@dasblinkenlight 所说的内容,您不需要明确地delete/remove它。由于 *temp 在函数的范围内,一旦函数 returns 它就会消失。
由于您担心未使用的内存,所以提醒一下 - 指针在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,而不是您可能的 sizeof(DLL_Node)思维。