【发布时间】:2021-09-24 17:54:15
【问题描述】:
我有一个链接列表,我试图在其中释放一个 char*,我使用了 strdup。
这些是我在列表中添加节点的方法:
node* add_first(char* name, node* head) {
node* new_node;
new_node = (node*)malloc(sizeof(node));
char* c = strdup(name);
new_node->name = c;
new_node->next = head;
head = new_node;
return head;
}
node * add_last(char* name, node *head ) {
node* new_node;
node* current;
new_node = (node*)malloc(sizeof(node));
char* c = strdup(name);
new_node->name = c;
new_node->next = NULL;
if ( head == NULL ){
head = new_node;
}
else{
current = head;
while ( current->next ) current = current->next;
current->next = new_node;
}
return head;
}
移除节点:
int remove_last( node **head, char **ret )
{
int result = *head == NULL ? -1 : 0;
if ( result == 0 )
{
while( ( *head )->next != NULL ) head = &( *head )->next;
*ret = strdup( ( *head )->name );
free( *head );
*head = NULL;
}
return result;
}
为了清理列表:
void deleteList(node** head){
node* current = *head;
node* next;
while(current != NULL){
next = current->next;
free(current->name);
free(current);
current = next;
}
*head = NULL;
}
但是 valgrind 说我“肯定丢失了”我在 add_last 函数中的 strdup 的记忆(但奇怪的是不是我的 add_first 函数)。
为什么它只发生在 add_last 方法上,我怎样才能正确释放它?我以为我正在释放 deleteList 方法中的所有节点和名称?
【问题讨论】:
标签: c memory-management linked-list free strdup