malloc与free对被操作内存的影响
2015-12-04 19:57
288 查看
欲解决问题“malloc得到的内存在free后是否真的释放给了OS?”
一个进程运行时,OS会分配给它一块堆空间,而当执行malloc时,会从这块堆空间中拿到一块连续的内存空间。内存分布如下:
当执行free释放掉这块内存空间后,这块内存还给了这个进程,但是这个进程依旧可以对这块空间进行操作,因为这块空间本来就是属于这个进程的堆空间。free之后,这个进程中可能会再malloc使用到这块空间,所以使用依旧free掉的空间是危险的。#include<stdio.h>
#include<stdlib.h>
int*lvret(void){
intret=5;
return&ret;
}
voidmod(void){
inta=7;
}
intmain(void){
int*p=lvret();
mod();
printf("%d\n",*p);
*p=2;
printf("%d\n",*p);
}
看上面这段代码,在调用完lvret函数后,ret这块空间已经相当于free掉了,但返回的指针保存了这块内存的地址;
随后又调用了mod函数,其中也定义了一个变量(相当于malloc),最后结果打印出来是“7”和“2”
说明之前的内存虽然free掉了,甚至已经被别的函数拿去使用了,但依旧可以访问到它甚至对其进行操作。
所以回到一开始的问题,我觉得free后的内存空间不是真正还给了OS,准确点说是还给了这个进程,因为free后这块内存是无法被其他进程使用的,而且依旧可能对其访问和操作(但这是危险的),所以并不是真正意义上的归还。
---------------------------------分割--------------------------------------------
Linux平台下代码:
运行结果:
分析:
malloc一片空间时,系统不会自动帮你把这块空间清零;
free一片空间时,系统会自动帮你清零;
通过malloc得到的空间在free后,依旧可以对其进行访问、赋值,而且在free后重新malloc可以得到free掉的那块空间,
这也进一步验证了malloc是从进程的堆空间申请内存,归还也是还到堆空间去。
我创建了另外一个进程2,去访问进程1malloc到的空间,出现段错误。
Windows平台下代码:
运行结果:
分析:
结果基本和linux平台下的一样,唯一的不同就是在windows环境下,当malloc一片空间时,OS会重新在这块地方填入随机数,
而不像linux下只有在free时才将这块空间清零。
一个进程运行时,OS会分配给它一块堆空间,而当执行malloc时,会从这块堆空间中拿到一块连续的内存空间。内存分布如下:
当执行free释放掉这块内存空间后,这块内存还给了这个进程,但是这个进程依旧可以对这块空间进行操作,因为这块空间本来就是属于这个进程的堆空间。free之后,这个进程中可能会再malloc使用到这块空间,所以使用依旧free掉的空间是危险的。
看上面这段代码,在调用完lvret函数后,ret这块空间已经相当于free掉了,但返回的指针保存了这块内存的地址;
随后又调用了mod函数,其中也定义了一个变量(相当于malloc),最后结果打印出来是“7”和“2”
说明之前的内存虽然free掉了,甚至已经被别的函数拿去使用了,但依旧可以访问到它甚至对其进行操作。
所以回到一开始的问题,我觉得free后的内存空间不是真正还给了OS,准确点说是还给了这个进程,因为free后这块内存是无法被其他进程使用的,而且依旧可能对其访问和操作(但这是危险的),所以并不是真正意义上的归还。
---------------------------------分割--------------------------------------------
Linux平台下代码:
运行结果:
分析:
malloc一片空间时,系统不会自动帮你把这块空间清零;
free一片空间时,系统会自动帮你清零;
通过malloc得到的空间在free后,依旧可以对其进行访问、赋值,而且在free后重新malloc可以得到free掉的那块空间,
这也进一步验证了malloc是从进程的堆空间申请内存,归还也是还到堆空间去。
我创建了另外一个进程2,去访问进程1malloc到的空间,出现段错误。
Windows平台下代码:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
int*p=(int*)malloc(4);
*p=5;
printf("Beforefree:%d\n",*p);
printf("pAdress:%d\n",p);
free(p);
printf("Afterfree:%d\n",*p);
*p=7;
printf("re:%d\n",*p);
int*q=(int*)malloc(4);
printf("Theqis:%d\n",*q);
printf("qAdress:%d\n",q);
}
运行结果:
分析:
结果基本和linux平台下的一样,唯一的不同就是在windows环境下,当malloc一片空间时,OS会重新在这块地方填入随机数,
而不像linux下只有在free时才将这块空间清零。
相关文章推荐
- .net开发菜鸟微信之一:菜中菜.....
- 递归思想实现大数问题(打印1到n位最大整数)
- 检测手机是否越狱
- bzoj1093 最大半连通子图 强连通分量&记忆化搜索
- span和div区别
- centos7.x/RedHat7.x重命名网卡名称
- openjudge 摘花生
- ICMP 协议基础详解
- unity3d发布apk资源打包和访问方式
- jdbc 初始化及插入语句
- 有吧友需要PDF的下载站点,好吧,我这边汇总一下
- 中间的球( floyd算法 )
- CodeForces 567C Geometric Progression 类似dp的递推统计方案数
- Number of 1 Bits
- html分页实现
- iOS 9人机界面指南:iOS 技术 (3D Touch、Live Photos、Wallet以及Apple Pay)
- Windows Server 2012 配置远程桌面帐户允许多用户同时登录
- 关于鼠标长按的代码
- Specify compute hosts with SSDs
- Minimum Inversion Number(线段树求逆序数)