Memory management 无效自由研磨
出于某种原因,多次调用我的函数“delAll”将导致Valgrind出现无效的自由错误。我不明白为什么如果我第二次调用这个函数会导致程序再次进入while循环,即使它只是节点的“delAll” //p是一个带有调用的链表Memory management 无效自由研磨,memory-management,Memory Management,出于某种原因,多次调用我的函数“delAll”将导致Valgrind出现无效的自由错误。我不明白为什么如果我第二次调用这个函数会导致程序再次进入while循环,即使它只是节点的“delAll” //p是一个带有调用的链表 struct node{ char *str, int data, struct node *next; } //以下是我遇到问题的函数: void delAll() { struct node *temp,*temp2; temp=p; while(temp!=NULL)
struct node{
char *str, int data, struct node *next;
}
//以下是我遇到问题的函数:
void delAll()
{
struct node *temp,*temp2;
temp=p;
while(temp!=NULL)
{
temp2=temp;
temp= temp->next;
free(temp2->str);
free(temp2);
}
}
p
是指向列表的指针,现在它仍然会在delAll调用点之后指向列表的(free'd)开头。我就这么做
p=NULL;
…在while循环之后立即将p设置为null(即正确清除列表)。这将阻止您的delAll再次尝试释放所有元素
当然,这取决于
p
不仅仅是一个临时变量,我假设它是真正的“列表开始”指针。p
是指向列表的指针,现在它仍然会在delAll调用后指向列表的(自由)开始。我就这么做
p=NULL;
…在while循环之后立即将p设置为null(即正确清除列表)。这将阻止您的delAll再次尝试释放所有元素
当然,这取决于
p
不仅仅是一个临时变量,我假设它是真正的“列表开始”指针;除了要添加temp2=NULL的free(temp2)
之外,free不会将值设置为NULL;除了free(temp2)
之外,您还需要添加temp2=NULL
。