什么是申请内存 释放内存 这时cpu都作了什么??
最近 看到一些与释放内存相关的课题。
非常不理解其中的原因。
目前知道(仅仅是知道),
c++ 申请了内存,堆上的空间不用时需要释放。
c# 堆上的对象实例占据的内存,在对象无效时,垃圾收集自动释放内存。
从所谓的原理上,我很理解。以前的一些变量,对象,占据了内存的空间。不用了,释放掉,清空“垃圾”的感觉。以后会仍然有较多的空间去用,不至于没有空间(内存溢出)的错误出现。
但是,不明白的是,所谓的申请内存与释放内存在 实际的内存中发生了什么呢??
比如,0x10000-0x1FFFF的内存地址,被申请内存函数申请了。那么,该怎么理解这个申请了呢??
在释放之前,其他的函数不能再申请这段空间?? 这段空间的地址范围在内存的其他地方存储起来了?? 编译器会在生成的代码中,有管理这个功能的相关二进制代码??(当然,源程序中怕是不会有这些代码的吧,否则也不会这么疑惑了)
那释放这段内存呢?? 意味着可以重新被申请这段地址空间???否则就不允许再申请这段空间???这段内存中的数据仍保留之前的状态?比如之前是0110010。
如果是c++,是不是因为有指针,也许会不小心因为某些操作又重新指向了这段地址从而出现错误??但java中,没有指针。是不是意味着只是内存空间的浪费?
还有,所谓的释放内存是什么概念呢?? 在程序的某段内存空间中标记此内存地址范围可用?? 还是把此内存地址范围都清零??比如之前的任何数据,都恢复为0000000。