C 中的 malloc() 和 free()

Posted

技术标签:

【中文标题】C 中的 malloc() 和 free()【英文标题】:malloc() and free() in C 【发布时间】:2021-12-11 22:59:25 【问题描述】:

我正在用 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;

【问题讨论】:

您已将其添加到链接列表中,因此您不应释放它。以后从链表中删除它的人应该根据需要释放它。 当你不再需要它时,你需要释放它。即删除节点时,或者清理整个列表时。 @jarmod 除非后来从列表中删除它的人保留引用并继续使用它 @gkhaos 因此“根据需要”,但是是的。 通常会发生内存泄漏,当您分配一些内存并丢失指向它的指针,因此无法再释放它。如果您仍在跟踪它(即它在您的链表中),则不会“泄漏”任何内存。 【参考方案1】:

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

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

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

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

void clear( void )

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

【讨论】:

【参考方案2】:

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

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

在简单的学生程序中,除了用于诊断内存泄漏问题的工具外,您不会观察到未能释放一点内存造成的任何不良影响。但是,这是您以后编写实用程序时必须学习的好习惯。

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

【讨论】:

以上是关于C 中的 malloc() 和 free()的主要内容,如果未能解决你的问题,请参考以下文章

C. 函数中的 malloc() 和 free() 不起作用 [重复]

c的free和c++的delete的区别

关于C语言free函数的问题

C语言中已经有了malloc和free,为啥还需要new和delete?

c语言中,malloc和free是啥意思?

malloc