C 带链表的Valgrind内存泄漏
当我用valgrind运行我的程序时,我注意到当我实现这个函数时,我只有一个小的内存泄漏(2个块)。这将删除节点,当列表打印出来时,节点将不再显示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) {
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()函数的代码,那么查看代码和回答这个问题会更容易。