在 C 中正确使用 free() 函数

Correct usage of free() function in C

我是 C 编程语言的新手,所以你能告诉我这是否是正确的方法吗?

例如: 程序指向缓冲区,我使用 pointer 作为 free() 函数中的参数。那么,这个功能会导致什么问题呢?

认为计算机有一大堆内存尚未(尚未)被您的程序使用。现在你需要更多的内存,你要求你的计算机给你更多的内存(例如,一个大缓冲区)。完成后,您想 return 将其传输到计算机。

这个内存叫做堆。你通过调用 malloc() 请求内存,你通过调用 free();

return 它
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

来自free()函数的man page

The free() function frees the memory space pointed to by a pointer ptr which must have been returned by a pre‐ vious call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.

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

您应该在 malloccallocrealloc 返回的已分配内存的指针上调用 free only

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 两次并且自第一次调用 free 以来 ptr 的值未更改,就会发生这种情况。或者你有两个(或更多)指向同一内存的不同指针:如果你在一个上调用 free,你现在也不允许在其他指针上调用 free

  • 当你释放一个指针时,你甚至不能 read 它的值;例如,释放后不允许 if (ptr),除非您将 ptr 初始化为新值

  • 你不应该解引用释放的指针

  • 传空指针给free就可以了,不做任何操作

free() 函数用于释放一个程序使用的内存并将其移回可用内存区域,以便其他操作系统进程可以使用该内存位置。 free 函数也接受指向该内存位置的任何类型的指针。 例如:

int a = 10;  // suppose 2 byte is allocated ie location 1000 and 1001

现在这2字节内存属于具体问题;因此 OS 不会将此内存位置提供给另一个进程(内存现在是分配内存而不是可用内存)

 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 个字节。

现在有趣的一点是,在 OS 将此内存分配给其他进程并且该进程覆盖它之前,您的数据将一直存在。

而且 ptr 即使在 free() 函数之后也指向 1000,但该内存位置不属于我们的程序,因此 ptr 指针已指定新名称 DANGLING POINTER

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