Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11489
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 72
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-20 09:37
文章分类
文章存档

2015年(6)

我的朋友

分类: LINUX

2015-12-04 20:12:29

欲解决问题“malloc得到的内存在free后是否真的释放给了OS?”
一个进程运行时,OS会分配给它一块堆空间,而当执行malloc时,会从这块堆空间中拿到一块连续的内存空间



当执行free释放掉这块内存空间后,这块内存还给了这个进程,但是这个进程依旧可以对这块空间进行操作,因为这块空间本来就是属于这个进程的堆空间。free之后,这个进程中可能会再malloc使用到这块空间,所以使用依旧free掉的空间是危险的。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. int *lvret(void) {
  4.     int ret = 5;
  5.     return &ret;
  6. }
  7. void mod(void) {
  8.     int a = 7;
  9. }
  10. int main(void) {
  11.     int *p = lvret();
  12.     mod();
  13.     printf("%d\n",*p);
  14.     *p=2;
  15.     printf("%d\n",*p);
  16. }
看上面这段代码,在调用完lvret函数后,ret这块空间已经相当于free掉了,但返回的指针保存了这块内存的地址;
随后又调用了mod函数,其中也定义了一个变量(相当于malloc),最后结果打印出来是 “7”和“2”
说明之前的内存虽然free掉了,甚至已经被别的函数拿去使用了,但依旧可以访问到它甚至对其进行操作。
所以回到一开始的问题,我觉得free后的内存空间不是真正还给了OS,准确点说是还给了这个进程,因为free后这块内存是无法被其他进程使用的,而且依旧可能对其访问和操作(但这是危险的),所以并不是真正意义上的归还。

--------------------------分割线----------------------------------
测试验证:
Linux平台代码:

运行结果:

分析:
malloc一片空间时,系统不会自动帮你把这块空间清零;
free一片空间时,系统会自动帮你清零;
通过malloc得到的空间在free后,依旧可以对其进行访问、赋值,而且在free后重新malloc可以得到free掉的那块空间,
这也进一步验证了malloc是从进程的堆空间申请内存,归还也是还到堆空间去。
我创建了另外一个进程2,去访问进程1malloc到的空间,出现段错误。



Windows平台代码:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int *p=(int*)malloc(4);
  6.     *p=5;
  7.     printf("Before free:%d\n",*p);
  8.     printf("p Adress:%d\n",p);
  9.     free(p);
  10.     printf("After free:%d\n",*p);
  11.     *p=7;
  12.     printf("re:%d\n",*p);
  13.     int *q=(int*)malloc(4);
  14.     printf("The q is:%d\n",*q);
  15.     printf("q Adress:%d\n",q);
  16. }
运行结果:

分析:
结果基本和linux平台下的一样,唯一的不同就是在windows环境下,当malloc一片空间时,OS会重新在这块地方填入随机数,
而不像linux下只有在free时才将这块空间清零。








阅读(493) | 评论(0) | 转发(0) |
0

上一篇:二叉树遍历

下一篇:没有了

给主人留下些什么吧!~~