C语言中free()函数的正确使用方法

10

我刚接触C编程语言,请问这样做是正确的吗?

例如: 程序在缓冲区上指向点,然后我将该指针作为参数传递给free()函数。那么,这个函数可能引起哪些问题?


4
如果你给free一个不是由malloc/calloc/realloc返回的指针,那么代码将表现为未定义行为。 - Spikatrix
4个回答

24

你应该只在指针被分配了由malloccallocrealloc返回的内存后,调用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

  • 当您释放指针时,甚至不允许读取其值;例如,除非您将ptr初始化为新值,否则不允许使用if (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

2

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),它将检查指针类型,并根据free函数的类型来释放内存,在这种情况下是从1000开始的2个字节。

有趣的是,您的数据将一直存在,直到操作系统将此内存分配给其他进程并覆盖它为止。

ptr即使在free()函数之后仍指向1000,但该内存位置不属于我们的程序,因此ptr指针被赋予新名称悬空指针

* ptr可能会或可能不会给出相同的值,因此最好将ptr = null


-1

free()函数的man page中:

free()函数释放由指针ptr指向的内存空间,该指针必须是之前调用malloc()calloc()realloc()返回的。否则,如果在调用free(ptr)之前已经调用了,则会发生未定义的行为。如果ptrNULL,则不执行任何操作。

当您动态分配内存时,必须使用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.

它是否会导致空间内存安全或时间内存安全错误? - David Demetradze
什么?char c = malloc(100)上分配了100个字节,将指针转换为char,然后存储到c中。调用free(c)将把c(一个字符)转换为指针,然后尝试释放它,这将导致系统崩溃,因为(大多数情况下)将指针转换为char再转回来会改变其值并使其成为无效指针。 - user202729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接