在 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.
您应该在 malloc
、calloc
或 realloc
返回的已分配内存的指针上调用 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
。
我是 C 编程语言的新手,所以你能告诉我这是否是正确的方法吗?
例如:
程序指向缓冲区,我使用 pointer
作为 free()
函数中的参数。那么,这个功能会导致什么问题呢?
认为计算机有一大堆内存尚未(尚未)被您的程序使用。现在你需要更多的内存,你要求你的计算机给你更多的内存(例如,一个大缓冲区)。完成后,您想 return 将其传输到计算机。
这个内存叫做堆。你通过调用 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
来自free()
函数的man page:
The
free()
function frees the memory space pointed to by a pointerptr
which must have been returned by a pre‐ vious call tomalloc()
,calloc()
orrealloc()
. Otherwise, or iffree(ptr)
has already been called before, undefined behavior occurs. Ifptr
isNULL
, 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.
您应该在 malloc
、calloc
或 realloc
返回的已分配内存的指针上调用 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
。