C,自由功能很奇怪。为什么呢?

时间:2015-05-15 11:25:13

标签: c

我为通用列表编写了代码。在它的功能中,它有一个freelist,createlist和copylist。 释放由createlist函数创建的列表时它一切正常,但是当试图释放由copylist函数创建的列表程序崩溃时,我在调试时检查了值,我仍然认为没有理由发生这种情况。 这就是我所拥有的:

void listDestroy(List list)
{
    if(list==NULL) return;
    listClear(list);
    free(list); //<-crashes here when freeing copied lists.
    list=NULL;
    return;
}

int main()
{
    List list = listCreate(copyString,freeString);
    List copied = listCopy(list);
    listDestroy(list);
    listDestroy(copied);
    printf("success");
    return 0;
}

List listCreate(CopyListElement copyElement, FreeListElement freeElement)
{
    if(!copyElement || !freeElement) return NULL;
    List newlist=malloc(sizeof(*newlist));
    if(newlist==NULL) return NULL;
    newlist->copy = copyElement;
    newlist->free= freeElement;
    newlist->nodes=NULL;
    newlist->iterator=NULL;
    return newlist;
}


Node *copynode(Node *node, CopyListElement copyElement)
{
    if(node==NULL) return NULL;
    Node *newnode=malloc(sizeof(newnode));
    if(newnode==NULL) return NULL;
    newnode->next=node->next;
    newnode->element=copyElement(node->element);
    return newnode;
}

List listCopy(List list)
{
    if(!list) return NULL;
    List newlist=malloc(sizeof(newlist));
    if(newlist==NULL) return NULL;
    newlist->copy = list->copy;
    newlist->free= list->free;
    if(list->nodes!=NULL)
    {
        Node *firstlink=copynode(list->nodes, newlist->copy);
        newlist->nodes=firstlink;
        newlist->iterator=firstlink;
        Node *newpointer=firstlink;
        Node *listPointer=list->nodes->next;
        while(listPointer!=NULL)
        {
            Node *newlink=copynode(listPointer, newlist->copy);
            newpointer->next=newlink;
            if(listPointer==list->iterator)
            {
                newlist->iterator=newlink;
            }
            listPointer=listPointer->next;
            newpointer=newpointer->next;
        }
    }
    else
    {
        newlist->iterator=NULL;
        newlist->nodes=NULL;
    }
    return newlist;
}

现在,虽然调试列表和复制(在main中)的值显示相同,但​​在释放列表工作时,免费复制会导致崩溃。 为什么呢?

2 个答案:

答案 0 :(得分:3)

首先:

listCopy()这个

List newlist=malloc(sizeof(newlist));

应该是

List newlist=malloc(sizeof(*newlist));

或更好:

List newlist = malloc(sizeof *newlist);

此行的copynode()相同:

Node *newnode=malloc(sizeof(newnode));

应该是

Node * newnode = malloc(sizeof *newnode);

顺便说一下,listDestroy()这一行:

list=NULL;

没用,因为list是复制到listDestroy()调用时作为参数给出的内容。

答案 1 :(得分:0)

List可能是指向某事物的指针。

listCopy()的第二行是

List newlist=malloc(sizeof(newlist));

这是不正确的,会导致以后的代码显示未定义的行为。

我不排除代码中出现其他错误的可能性。