我为通用列表编写了代码。在它的功能中,它有一个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中)的值显示相同,但在释放列表工作时,免费复制会导致崩溃。 为什么呢?
答案 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));
这是不正确的,会导致以后的代码显示未定义的行为。
我不排除代码中出现其他错误的可能性。