C 编程 free() 函数错误
C Programming free() Function Error
所以这是一个关于 C 编程中的 free() 函数的初学者问题,当我尝试使用 free() 函数最终释放和释放内存时,我不断出现双重释放或损坏错误,或者循环不会最后,我在同一程序中编写的其他类似功能也遇到了同样的问题。我什么时候做错了?
int addnode(struct node *add, struct node *p,int dep)
{
int count=0;
dep=1;
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
while(roo){
if(add->data >roo->data&&roo->right!=NULL)
{
roo=roo->right;
dep++;
}
if(add->data <roo->data&&roo->left!=NULL)
{
roo=roo->left;
dep++;
}
if(add->data >roo->data&&roo->right==NULL)
{
roo->right=add;
dep++;
break;
}
if(add->data <roo->data&&roo->left==NULL)
{
roo->left=add;
dep++;
break;
}
free(roo);
}
return dep;
}
在一行中分配内存并分配给 roo
,在下一行中立即分配另一个值:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
该变量稍后又被重新分配了几次。因此最后它会尝试释放与分配完全不同的内存。
算法好像不太清楚,我建议适当命名变量并指定输入和输出的目的。到目前为止,似乎在调用函数时已经分配了要添加的节点,因此不应有任何理由在该函数内进行任何额外分配。
您是否考虑过使用诸如 valgrind 之类的内存调试器?我花了三十秒的分析才注意到一个常见的内存泄漏:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
此泄漏本身不会引起您的不适,但您可能希望修复它们以获得性能优势,否则您最终可能会遇到占用所有内存的程序。
在此之后,在您 free(roo);
未修改 roo
之后,您的循环测试 while(roo)
使用了一个无效的指针(因为您已经 free
修改了它);这是未定义的行为,随后的行为(取消引用该无效指针)可能会导致您描述的症状。 Valgrind 会选择这个。
所以这是一个关于 C 编程中的 free() 函数的初学者问题,当我尝试使用 free() 函数最终释放和释放内存时,我不断出现双重释放或损坏错误,或者循环不会最后,我在同一程序中编写的其他类似功能也遇到了同样的问题。我什么时候做错了?
int addnode(struct node *add, struct node *p,int dep)
{
int count=0;
dep=1;
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
while(roo){
if(add->data >roo->data&&roo->right!=NULL)
{
roo=roo->right;
dep++;
}
if(add->data <roo->data&&roo->left!=NULL)
{
roo=roo->left;
dep++;
}
if(add->data >roo->data&&roo->right==NULL)
{
roo->right=add;
dep++;
break;
}
if(add->data <roo->data&&roo->left==NULL)
{
roo->left=add;
dep++;
break;
}
free(roo);
}
return dep;
}
在一行中分配内存并分配给 roo
,在下一行中立即分配另一个值:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
该变量稍后又被重新分配了几次。因此最后它会尝试释放与分配完全不同的内存。
算法好像不太清楚,我建议适当命名变量并指定输入和输出的目的。到目前为止,似乎在调用函数时已经分配了要添加的节点,因此不应有任何理由在该函数内进行任何额外分配。
您是否考虑过使用诸如 valgrind 之类的内存调试器?我花了三十秒的分析才注意到一个常见的内存泄漏:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
此泄漏本身不会引起您的不适,但您可能希望修复它们以获得性能优势,否则您最终可能会遇到占用所有内存的程序。
在此之后,在您 free(roo);
未修改 roo
之后,您的循环测试 while(roo)
使用了一个无效的指针(因为您已经 free
修改了它);这是未定义的行为,随后的行为(取消引用该无效指针)可能会导致您描述的症状。 Valgrind 会选择这个。