我不确定以哪种方式取消list
Item
list
。每个item
都有第一个和最后一个项目,每个nextItem
都链接到for(myItem=list.firstItem; myItem!=list.lastItem; myItem=myItem->nextItem)
dealloc(myItem);
,直到它为空。
for(myItem=list.firstItem; myItem!=NULL; myItem=myItem->nextItem)
dealloc(myItem);
或
myItem->nextItem = NULL
myItem=list.lastItem
if myItem
。
我不确定使用for的第一个声明是否会释放所有NULL
或者如果lastItem不是dealloc。 (我相信这将会发生。)
另一方面,当您分配给myItem
一个{{1}}时,我不确定第二个声明是否会使一切崩溃/无法正常工作。
答案 0 :(得分:3)
两个程序都有未定义的行为,因为在释放myItem
指针后取消引用它。这是不允许的,可能会导致程序崩溃。
当您首先获得while
指针时,释放链接列表的正确方法是使用next
循环,然后才解除分配节点:
ItemNode *myItem = list.firstItem;
while (myItem != NULL) {
ItemNode *tmp = myItem;
myItem = myItem->nextNode;
dealloc(tmp);
}
答案 1 :(得分:0)
请注意,两种方式都不正确。由于for循环的实现方式,您在解除分配后引用myItem
。你需要写一些类似的东西:
for(myItem=list.firstItem; myItem!=NULL; ) {
nextItem = myItem->nextItem
dealloc(myItem);
myItem = nextItem;
}