开发者社区> 问答> 正文

free释放内存后,内存空间的疑问

1.free 一段内存后,为什么还可以对这段内存进行读写。。。按照网上以及书上的说法,释放内存后,这段内存就不应该使用了,操作系统就可以分配给其他任务。。

我的疑问是,释放内存后,这段内存资源还是否属于当前进程???

如果属于当前进程,那么读写访问无可厚非。

可是,操作系统可以再次利用这段内存并分配给其他人,那么这里的 “其他”只是限定在当前进程中吗,只是给当前进程其他代码中的内存申请来使用么?

2.局部的数组,在函数运行完毕后,应该释放,但是为什么依然可以读写其中的数据 ?

展开
收起
a123456678 2016-06-06 10:15:24 1945 0
1 条回答
写回答
取消 提交回答
  • 首先你需要知道,进程使用的都是虚拟地址空间,每个进程都有独立的,完整的4GB(32bit下)地址空间,未必每一块内存都会映射到物理内存,这个映射工作是操作系统完成的。如果你访问了地址空间里未映射的内存,或者写了只读的区域,操作系统就会报错(Segment Fault错误,呵呵~)并终止你的程序。

    当一个进程开始运行时,会向操作系统申请一块“堆”内存,由程序自己对这块堆内存进行管理,malloc就是从这块内存中分配内存,在C语言中,这个申请和管理堆内存的工作是由运行库自动完成的。

    当free一块内存后,free(即运行库)会将这块内存标记为未使用,下次有可能会将这块内存分配出去。但这块内存对进程来说仍然是可以读写的,因为运行库已经向操作系统申请,自己来管理这块内存了。

    局部变量是分配在栈上的,进程开始运行时,操作系统会分配给进程一块固定大小(通常是1MB)的栈,所谓分配和释放局部变量,都只是在移动栈顶指针而已,只要没超过栈的这1MB内存区域,都还是可以读写的。

    以上都是常见操作系统的典型行为,也许在某些操作系统和平台上并非这么工作,总之,使用已释放的内存是非常危险的行为。

    有兴趣可以读这两本书《深入理解计算机系统》《链接装载与库》

    2019-07-17 19:27:47
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载