本文为数据结构打下基础
备注:数据结构需要掌握指针,结构体和动态内存管理
目录
3.free函数
cplusplus网的翻译
函数
free
void free (void* ptr);
释放内存块
之前通过调用malloc来分配一块内存,calloc和realloc是来释放内存块的,让内存块可以用于后续的分配如果ptr指针不指向通过上述函数分配的内存块,会导致为未定义行为
如果ptr指针为空,该函数不作任何处理
注意到函数不自己改变ptr的值,因此函数仍然指向同一个位置(现在无效)
参数
ptr:指向之前被malloc,calloc或realloc分配的内存块
返回值
无(原因为void类型)
提炼要点
1.free函数用来释放动态开辟的内存
2.参数ptr指向的空间为malloc,calloc或realloc开辟的空间
3.如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的
禁止这样写:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0;
int* p = &a;
free(p);
}
4.如果参数ptr是NULL指针,则函数不做任何处理
5.使用free函数要加#include <stdlib.h>
使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(20);
if (p != NULL)
{
*p = 1;
printf("%d", *p);
return 0;
}
else
{
perror("malloc");
return 1;
}
free(p);
}
x86+debug环境下, 打开内存窗口
执行完int* p = (int*)malloc(20);后输入p
执行完*p = 1; 再次查看
执行完free(p);再次查看
指针p的值没有变化,而且free函数不对之前分配的内存空间赋新值,只是交换给操作系统,因此没有变化
建议
1.虽然free函数没有改变指针的值,但建议手动为p赋NULL,否则为野指针(对之前开辟的内存空间没有使用权限)
2.有分配内存空间(,malloc,calloc,realloc)就有释放内存空间(free)