1.free 一段内存后,为什么还可以对这段内存进行读写。。。按照网上以及书上的说法,释放内存后,这段内存就不应该使用了,操作系统就可以分配给其他任务。。
我的疑问是,释放内存后,这段内存资源还是否属于当前进程???
如果属于当前进程,那么读写访问无可厚非。
可是,操作系统可以再次利用这段内存并分配给其他人,那么这里的 “其他”只是限定在当前进程中吗,只是给当前进程其他代码中的内存申请来使用么?
2.局部的数组,在函数运行完毕后,应该释放,但是为什么依然可以读写其中的数据 ?
首先你需要知道,进程使用的都是虚拟地址空间,每个进程都有独立的,完整的4GB(32bit下)地址空间,未必每一块内存都会映射到物理内存,这个映射工作是操作系统完成的。如果你访问了地址空间里未映射的内存,或者写了只读的区域,操作系统就会报错(Segment Fault错误,呵呵~)并终止你的程序。
当一个进程开始运行时,会向操作系统申请一块“堆”内存,由程序自己对这块堆内存进行管理,malloc就是从这块内存中分配内存,在C语言中,这个申请和管理堆内存的工作是由运行库自动完成的。
当free一块内存后,free(即运行库)会将这块内存标记为未使用,下次有可能会将这块内存分配出去。但这块内存对进程来说仍然是可以读写的,因为运行库已经向操作系统申请,自己来管理这块内存了。
局部变量是分配在栈上的,进程开始运行时,操作系统会分配给进程一块固定大小(通常是1MB)的栈,所谓分配和释放局部变量,都只是在移动栈顶指针而已,只要没超过栈的这1MB内存区域,都还是可以读写的。
以上都是常见操作系统的典型行为,也许在某些操作系统和平台上并非这么工作,总之,使用已释放的内存是非常危险的行为。
有兴趣可以读这两本书《深入理解计算机系统》《链接装载与库》
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。