Memory management 无效自由研磨

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)

出于某种原因,多次调用我的函数“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)
{

    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