C编程free()函数错误

时间:2017-02-05 04:42:31

标签: c function free

所以这里是关于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;
}

2 个答案:

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