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