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 会选择这个。