我刚接触C编程语言,请问这样做是正确的吗?
例如:
程序在缓冲区上指向点,然后我将该指针作为参数传递给free()
函数。那么,这个函数可能引起哪些问题?
你应该只在指针被分配了由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
。
当您释放指针时,甚至不允许读取其值;例如,除非您将ptr
初始化为新值,否则不允许使用if (ptr)
您不应该取消引用已释放的指针
向free
传递空指针是可以的,不执行任何操作。
想象一下计算机有一大堆内存,但你的程序并没有使用(全部)它。现在你需要更多的内存,并要求计算机给你一些(例如,一个大缓冲区)。一旦你使用完毕,你希望将其归还给计算机。
这种内存被称为堆。你通过调用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()
函数用于释放程序使用的内存并将其移回可用内存区域,以便其他操作系统进程可以使用该内存位置。此外,free
函数接受指向该内存位置的任何类型的指针。
例如:
int a = 10; // suppose 2 byte is allocated ie location 1000 and 1001
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
。
从free()
函数的man page中:
free()
函数释放由指针ptr
指向的内存空间,该指针必须是之前调用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
再转回来会改变其值并使其成为无效指针。 - user202729
free
一个不是由malloc
/calloc
/realloc
返回的指针,那么代码将表现为未定义行为。 - Spikatrix