为什么会这样,free到底干了什么

[复制链接]
查看11 | 回复5 | 2021-1-27 05:27:05 | 显示全部楼层 |阅读模式
#include
#include
intmain()
{
int*p;
//p=(int*)malloc(sizeof(int));
*p=5;
printf("%p%d\n",p,*p);
//free(p);
//*p=6;
//printf("%p%d\n",p,*p);
return0;
}
提示p没有初始化,没有任何输出
而下面程序执行得到合理的结果
#include
#include
intmain()
{
int*p;
p=(int*)malloc(sizeof(int));
*p=5;
printf("%p%d\n",p,*p);
free(p);
//*p=6;
printf("%p%d\n",p,*p);
return0;
}
0x55e7822282a05
0x55e7822282a00
但是下面程序释放了申请了内存为什么*P还会被赋值6?
#include
#include
intmain()
{
int*p;
p=(int*)malloc(sizeof(int));
*p=5;
printf("%p%d\n",p,*p);
free(p);
*p=6;
printf("%p%d\n",p,*p);
return0;
}
0x55e5857e22a05
0x55e5857e22a06
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
释放内存就是设置一个flag,告诉系统这块内存已经不用了,系统可以把这块内存拿给其他程序使用,但是系统不一定马上会把它分配给其它程序(要看其它程序malloc时是否刚好分配到这块内存),一时半会这块内存属于自由状态,所以继续使用该内存可能不会出错,相当于没有申请内存所有权就强行侵占内存使用。所以*p=6就属于这种行为,一时半会可能不会出错。如果该内存被其他程序分配申请使用权了,那*p=6可能就会报内存非法访问错误了。

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
引用楼主学码就是爱好的回复:但是下面程序释放了申请了内存为什么*P还会被赋值6?
#include
#include
intmain()
{
int*p;
p=(int*)malloc(sizeof(int));
*p=5;
printf("%p%d\n",p,*p);
free(p);
*p=6;
printf("%p%d\n",p,*p);
return0;
}
0x55e5857e22a05
0x55e5857e22a06

#include
#include
intmain(void)
{
int*p;
p=(int*)malloc(sizeof(int));
*p=5;
printf("%p%d\n",p,*p);
free(p);//这句执行后p就成为野指针,p指向的内存被释放,不归你程序所有
*p=6;//这句是非法访问
//如果在这里插入其他函数调用,你再试试
{
p=(int*)malloc(sizeof(int));
*p=5;
free(p);
}
printf("%p%d\n",p,*p);
return0;
}

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
intmain()
{
int*p;
printf("%p%d\n",p,*p);//此时p未初始化称之为野指针也就是p本身地址未知->00400080p指向的地址未知->17744
*p=5;//p本身的地址未知,那么你可能无法将p指向其他地址因为此时p本身的地址你可能无权限访问
p=(int*)malloc(sizeof(int));//此时给p初始化了p的地址为0x55e5857e22a0
*p=5;//此时你可以将p指针指向其地址了p=0x55e5857e22a0*p=5
printf("%p%d\n",p,*p);
free(p);//free是释放p指向的地址此时p=0x55e5857e22a0*p=0
*p=6;//将p指向另外一个地址此时p=0x55e5857e22a0*p=6
printf("%p%d\n",p,*p);//总结以下:free是释放p指向的地址p指针本身的地址是不变的所以如果你要释放一个地址,最好如下写:
free(p);
p=NULL;//只释放地址,本身地址不为null的指针叫迷途指针在大的程序中很可能会出问题
return0;
}

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
free是针对malloc/realloc等在堆上申请空间的释放用的。用于标记申请的空间可以再次被申请了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行