如果要销毁链表和可用内存,是否可以直接将head = NULL放置?

问题描述

我们为什么需要free()?将头节点设置为NULL可以完成类似的工作,不是吗?

解决方法

我们为什么需要free()?

函数free用于释放动态分配的内存。

将头节点设置为NULL可以完成类似的工作,不是吗?

在指向头节点的指针中放入NULL不会释放列表中所有头节点或其他节点的所有动态分配内存。这会导致失去第一个动态分配的节点的地址,结果,由于内存变得不可访问(但无法释放),您将发生大量内存泄漏。

请考虑以下演示程序。

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    int *p1 = malloc( sizeof( int ) );
    
    *p1 = 10;
    
    printf( "*p1 = %d\n",*p1 );
    
    int *p2 = p1;
    
    p1 = NULL;
    
    printf( "*p2 = %d\n",*p2 );
    
    free( p2 );
    
    return 0;
}

其输出为

*p1 = 10
*p2 = 10

在程序中,为类型int的对象动态分配了一个内存,并且分配的内存的地址已分配给指针p1

在将NULL分配给指针p1之后,分配的内存地址不再存储在该指针中。

因此,如果未将地址分配给第二个指针p2,则分配的内存的地址将永远丢失,并且我们无法释放内存。

仅由于指针p2中有地址的副本,我们才能释放分配的内存。

因此将指针设置为NULL只会更改指针中存储的值。分配的内存没有任何触动。

,

它们不是等效的。

在C中,如果您显式分配了内存(例如,通过使用malloc),则需要显式释放内存(通过使用free)。

如果仅分配head = NULL,将无法访问链表中的以下元素,但它们的内存仍将被分配-进程仍将保留该内存,并且您将拥有您手上的内存泄漏。

,

因为C中没有垃圾收集器。这意味着您应该自己收集垃圾。 您在堆上分配的所有内容都必须手动删除。 忘记执行此操作称为内存泄漏