C - 链表for循环疑问

标签 c list dealloc

我不确定以何种方式释放我的 Itemlist。每个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

我不确定使用 for 的第一个声明是否会释放所有 myItem 或者最后一个Item是否不会被释放。 (我相信这将会发生。) 另一方面,我不确定当您分配给 NULLa myItem 时,第二个声明是否会使一切崩溃/无法正常工作。

最佳答案

两个程序都有未定义的行为,因为您在释放 myItem 指针后取消引用它。这是不允许的,并且可能会使您的程序崩溃。

释放链表的正确方法是使用 while 循环,当您首先获取 next 指针时,然后才释放节点:

ItemNode *myItem = list.firstItem;
while (myItem != NULL) {
    ItemNode *tmp = myItem;
    myItem = myItem->nextNode;
    dealloc(tmp);
}

关于C - 链表for循环疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29596773/

相关文章:

python - 将字符串的选择字符 append 到列表

具有多个 View / subview 的iPhone应用程序: memory is not being deallocated

iphone - -[CALayer释放] : message sent to deallocated instance

swift - 按下后在 uiviewcontroller 内部不调用 deinit - Swift

java - 如何从 Set 和 Comparator 获取列表

r - 剪切树状图

c - 为什么这个删除所有评论的程序不起作用?

C 程序检查用户输入的多个数字并打印出它们是否为素数

c - 在我可以在循环中使用的相同变量名中 malloc 一些其他内存量之前,我需要采取哪些步骤?

c - sizeof(struct ExampleStruct) 或 sizeof( *VarExampleStruct) - 哪个是更好的编码实践?