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() 不起作用 [重复]