C 中的 malloc() 和 free()

malloc() and free() in C

我正在用 C 语言编写程序,并且在函数中使用了 malloc()。我必须在函数之后使用 free() 吗?如果我不释放它是否会导致内存泄漏,因为它只是一个函数?

谢谢。

void insertFirst(int key, int data) {
   //create a link
   struct node *link = (struct node*) malloc(sizeof(struct node));
    
   link->key = key;
   link->data = data;
    
   //point it to old first node
   link->next = head;
    
   //point first to new first node
   head = link;
}

该函数将在函数内动态分配的节点添加到单链表中。

在该函数中,您不得释放为节点分配的内存。否则列表将引用无效对象。

您需要编写一个函数,以便在不再需要列表时为列表释放所有分配的内存(节点)。

例如函数可以如下所示(考虑到指针 head 在列表的实现中被声明为全局变量)

void clear( void )
{
    while ( head != NULL )
    {
        struct node *tmp = head;
        head = head->next;
        free( tmp );
    }
}  

一旦您的程序分配了内存,它就会保持分配状态,直到您的程序释放它。

一般情况下,您不需要释放内存。在通用多用户操作系统中,操作系统会在程序退出时释放您的程序持有的所有资源。然而,当您的程序使用完内存时释放内存通常是一个好习惯。在重复执行各种操作的程序中尤其如此。如果在每次重复中,一个程序分配了内存但没有释放它,那么该程序对内存的使用会随着时间的推移越来越大。这可能会干扰系统上的其他程序 运行。

在简单的学生程序中,除了诊断内存泄漏的工具抱怨外,您不会观察到因未能释放少量内存而产生的任何不良影响。但是,这是一个很好的实践,你必须学习,以便以后编写实用程序。

通常,分配内存的函数与释放内存的函数配对。在最低级别,malloc 分配内存,free 释放内存。然后,在将节点添加到链表的函数中,insertFirst 将使用 malloc 分配内存并且不会释放它,因为需要内存来将对象保存在链表中。相反,insertFirst 将与一些从链表中删除节点的函数配对,并且该函数将调用 free 来释放内存。