我正在用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
来释放内存。