所以这里是关于C编程中free()函数的初学者问题,当我尝试使用free()函数释放释放内存时,我不断获得双重释放或损坏错误或循环赢得&# 39; t end,我在同一个程序中编写的另一个类似函数遇到了同样的问题。我什么时候做错了?
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;
}
答案 0 :(得分:2)
在一行上分配内存并分配给roo
,然后在下一行中立即为其分配另一个值:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
稍后将该变量重新分配几次。因此,它最终会尝试释放与分配完全不同的内存。
算法似乎很不清楚,我建议正确命名变量并指定输入和输出的目的。到目前为止,似乎在调用函数时已经分配了要添加的节点,因此在此函数中不应该有任何额外分配的原因。
答案 1 :(得分:2)
您是否考虑过使用valgrind等内存调试器?我花了三十秒的分析来注意常见的内存泄漏:
struct node *roo=(struct node*)malloc(sizeof(struct node*));
roo=p;
这种泄漏本身不会导致你感到困扰,但你可能想要修复它们以获得性能优势,否则你最终可能会占用一个程序来占用你所有的记忆。
在此之后,在free(roo);
未修改roo
后,您的循环测试while(roo)
会使用无效的指针(因为您free
d);这是未定义的行为,它后面的内容(取消引用该无效指针)可能会导致您描述的症状。 Valgrind会选择这个。