c语言中free()函数做了什么
注:以下程序由Ubuntu系统下GCC9.3.0编译完成
当使用free(ptr)释放由malloc()等内存分配函数分配的堆内存时,该函数都做了如下工作:
1. 解除指定指针对该内存的引用,使得此堆内存可以重新被分配
2. 对该内存上得数据清零
需要注意得是,free()后得指针仍然保留该堆内存得地址,并且仍然可以访问。访问free得堆内存是未定义行为,所以为了保证程序得安全,通常在free后会将指针置为NULL,即ptr=NULL。
示例代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int *ptr;
puts("int:");
if ((ptr = malloc(sizeof(int))) != NULL)
{
*ptr = 100;
printf("before free pointed address: 0x%lx\n", (unsigned long) ptr);
printf("before free pointed value: %d\n", *ptr);
free(ptr);
printf("after free pointed address: 0x%lx\n", (unsigned long) ptr);
// 被free后该地址仍可访问
printf("after free pointed value: %d\n", *ptr);
*ptr = 1;
printf("after being modified pointed value: %d\n", *ptr);
}
puts("string:");
char *strptr;
if ((strptr = malloc(sizeof(char)*6)) != NULL)
{
strncpy(strptr, "hello", 6);
printf("before free pointed address: 0x%lx\n", (unsigned long) strptr);
printf("before free stored string: %s\n", strptr);
free(strptr);
puts("freed");
printf("after free pointed address: 0x%lx\n", (unsigned long) strptr);
// 被free后该地址仍可访问
printf("after free stored string: %s\n", strptr);
strptr = "hhhhh";
printf("after being modified stored string: %s\n", strptr);
}
exit(EXIT_SUCCESS);
}
输出
int:
before free pointed address: 0x55c49d1606b0
before free pointed value: 100
after free pointed address: 0x55c49d1606b0
after free pointed value: 0
after being modified pointed value: 1
string:
before free pointed address: 0x55c49d1606b0
before free stored string: hello
freed
after free pointed address: 0x55c49d1606b0
after free stored string:
after being modified stored string: hhhhh

浙公网安备 33010602011771号