在 C 中正确使用 free() 函数
Posted
技术标签:
【中文标题】在 C 中正确使用 free() 函数【英文标题】:Correct usage of free() function in C 【发布时间】:2015-06-09 07:09:20 【问题描述】:我是 C 编程语言的新手,你能告诉我这是否正确吗?
例如:
缓冲区上的程序点,我使用pointer
作为free()
函数中的参数。那么,这个功能会导致什么问题呢?
【问题讨论】:
如果你给free
的指针不是malloc
/calloc
/realloc
返回的指针,那么代码会出现未定义行为
【参考方案1】:
您应该仅在由malloc
、calloc
或realloc
返回的分配内存的指针上调用free。
char* ptr = malloc(10);
// use memory pointed by ptr
// e.g., strcpy(ptr,"hello");
free(ptr); // free memory pointed by ptr when you don't need it anymore
注意事项:
永远不要释放内存两次。例如,如果您在ptr
上调用free
两次并且ptr
的值自第一次调用free
以来没有更改,则可能会发生这种情况。或者你有两个(或更多)不同的指针指向同一个内存:如果你在一个上调用 free,你现在也不能在其他指针上调用 free
。
当你释放一个指针时,你甚至不能read它的值;例如,if (ptr)
在释放后不允许使用,除非您将 ptr
初始化为新值
你不应该取消引用释放的指针
将空指针传递给free
可以,不执行任何操作。
【讨论】:
【参考方案2】:认为计算机有一大堆内存(尚未)被您的程序使用。现在您需要更多内存,并要求计算机提供更多内存(例如,一个大缓冲区)。完成后,您希望将其返回到计算机。
这个内存称为堆。调用malloc()
请求内存,调用free()
返回内存;
char *buffer;
buffer = malloc(512); // ask for 512 bytes of memory
if (buffer==NULL) return -1; // if no more memory available
...
free(buffer); // return the memory again
【讨论】:
【参考方案3】:free()
函数用于释放一个程序使用的内存并将其移回可用内存区域,以便其他操作系统进程可以使用该内存位置。此外,free
函数采用指向该内存位置的任何类型的指针。
例如:
int a = 10; // suppose 2 byte is allocated ie location 1000 and 1001
现在这2个字节的内存属于特定问题;因此操作系统不会将此内存位置提供给另一个进程(内存现在分配的内存不可用内存)
int *ptr =&a;
/*ptr is pointer variable pointing to 1000
as it is int pointer therefore ptr++ will move pointer to 1002*/
现在如果我们执行free(ptr)
,它将检查指针类型并根据类型释放函数释放内存,在这种情况下从 1000 开始分配 2 个字节。
现在有趣的一点是,在操作系统将此内存分配给其他进程并且该进程将其覆盖之前,您的数据将一直存在。
即使在free()
函数之后,ptr
也指向 1000,但该内存位置不属于我们的程序,因此ptr
指针已赋予新名称DANGLING POINTER
。
*ptr
可能会或可能不会给出相同的值,因此最好设为ptr =null
。
【讨论】:
【参考方案4】:来自free()
函数的man page:
free()
函数释放指针ptr
指向的内存空间,该指针必须由 pre- 返回 强烈致电malloc()
、calloc()
或realloc()
。否则,或者如果free(ptr)
已经被调用 之前,会发生未定义的行为。如果ptr
为NULL
,则不进行任何操作。
动态分配内存时必须使用free()
函数。
如果您将其用作静态变量,则可能会导致意外行为。
char *c=malloc(100);//allocating the 100 bytes of memory for a pointer variable c.
使用该变量后,您可以释放分配的内存,
free(c);
如果你被声明为这样的变量,
char c= malloc(100);// It is illegeal. And c will have a memory in stack.
如果你释放这个变量,
free(c);//it will lead to system crash. Because your freeing the memory which is in stack memory.
【讨论】:
会导致空间内存安全或时间内存安全错误吗? ...什么?char c = malloc(100)
在堆上分配100个字节,将指针转换为char
,然后存储到c
。调用free(c)
会将c
(一个字符)转换为一个指针,然后尝试释放它,这将导致系统崩溃,因为(大部分时间)将一个指针转换为char
并返回会改变它的值并使其成为无效指针。以上是关于在 C 中正确使用 free() 函数的主要内容,如果未能解决你的问题,请参考以下文章