C语言 如何正确释放链表

b1uwtaje  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(155)

有一个任务需要释放一个链表,我使用下面的第一个代码。但是有一些错误[什么错误?在检查员[什么检查员?],而是建议我使用第二个代码片段。但我看不出有什么区别。当下一个节点的地址存储在变量tmp中时,为什么第一个被认为是错误的?当释放head变量中分配的内存时,它不会丢失吗?
第一个代码:

while (head)
{
    tmp = head->next;
    free(head);
    head = tmp;
}

第二个代码:

while (head)
{
    tmp = head;
    head = head->next;
    free(tmp);
}

最后,有这两个选项,哪一个被认为是更准确和更有效的逻辑明智的?

k5ifujac

k5ifujac1#

假设两个版本中所涉及的变量的声明完全相同,那么这两个版本实际上做了同样的事情。
我想不出为什么一个比另一个更受欢迎。
有趣的是,当用gcc来完成这个操作时,两个版本都产生了完全相同的汇编代码:

free1:
        test    rdi, rdi
        je      .L9
        push    rbx
        mov     rbx, rdi
.L3:
        mov     rdi, rbx
        mov     rbx, QWORD PTR [rbx]
        call    free
        test    rbx, rbx
        jne     .L3
        pop     rbx
        ret
.L9:
        ret

Demo
... clang也是如此,它为两个版本生成以下内容:

free1:                                  # @free1
        test    rdi, rdi
        je      .LBB0_4
        push    rbx
.LBB0_2:                                # =>This Inner Loop Header: Depth=1
        mov     rbx, qword ptr [rdi]
        call    free@PLT
        mov     rdi, rbx
        test    rbx, rbx
        jne     .LBB0_2
        pop     rbx
.LBB0_4:
        ret

Demo

相关问题