C 带链表的Valgrind内存泄漏

C 带链表的Valgrind内存泄漏,c,memory-leaks,linked-list,C,Memory Leaks,Linked List,当我用valgrind运行我的程序时,我注意到当我实现这个函数时,我只有一个小的内存泄漏(2个块)。这将删除节点,当列表打印出来时,节点将不再显示 car *removeCar(car *head, char *targetModel) { car *temp=head; car *temp2=head->next; if(strcmp(temp->model,targetModel)==0) { return head; } while(temp2!=NULL) {

当我用valgrind运行我的程序时,我注意到当我实现这个函数时,我只有一个小的内存泄漏(2个块)。这将删除节点,当列表打印出来时,节点将不再显示

car *removeCar(car *head, char *targetModel) {

car *temp=head;
car *temp2=head->next;

if(strcmp(temp->model,targetModel)==0) {
    return head;
}

while(temp2!=NULL) {
    if(strcmp(temp2->model,targetModel)==0) {

        temp->next=temp2->next;
        free(temp2);

        return head;
    }

    temp=temp->next;
    temp2=temp2->next;
}

return head;
}
这是我的自由函数。在我选择调用removeCar函数之前,它一直在释放内存

void freeMem(car *head) {/*Function frees all memory allocated to linked lists*/

car *current=NULL;

while((current=head)!=NULL) {
    head=head->next;
    free(current->model);
    free(current->color);
    free(current);
}
}

如果您有任何建议,我将不胜感激。

对于链接列表,我通常会添加一个额外的间接链接,因此在处理列表标题时不需要额外的处理

car *removeCar(car *head, char *targetModel) 
{
    car * * ppNode = &head;
    while (*ppNode)
    {
        car* pCurrent = *ppNode;
        if(strcmp(pCurrent->model,targetModel)==0) 
        {
           //replace the reference to pCurrent by its successor
           *ppNode = pCurrent->next;
           free(pCurrent->model);
           free(pCurrent->color);
           free(pCurrent);
           break;
        }
        ppNode = &pCurrent->next;
    }
    return head; //possibly changed
}

我要冒险出去。我怀疑你打算调用
freeMem(temp2)
,但出于习惯,你调用了
free(temp2)
,从而泄露了
模型和
颜色
免费(temp2->color)在调用
免费(temp2)之前
调用
freeMem(temp2)
将从temp2开始释放整个列表,而不是单个项目。
如果(strcmp(temp->model,targetModel)==0){return head;}
出现错误。我希望它会释放内存,一些内存,比如
if(strcmp(temp2->model,targetModel)==0){
块会释放内存。如果您使用适当的缩进格式化代码,并且还包含分配内存和调用freemm()函数的代码,那么查看代码和回答这个问题会更容易。