最近 看到一些与释放内存相关的课题。非常不理解其中的原因。目前知道(仅仅是知道),
c++ 申请了内存,堆上的空间不用时需要释放。
c# 堆上的对象实例占据的内存,在对象无效时,垃圾收集自动释放内存。 从所谓的原理上,我很理解。以前的一些变量,对象,占据了内存的空间。不用了,释放掉,清空“垃圾”的感觉。以后会仍然有较多的空间去用,不至于没有空间(内存溢出)的错误出现。 但是,不明白的是,所谓的申请内存与释放内存在 实际的内存中发生了什么呢?? 比如,0x10000-0x1FFFF的内存地址,被申请内存函数申请了。那么,该怎么理解这个申请了呢??
在释放之前,其他的函数不能再申请这段空间?? 这段空间的地址范围在内存的其他地方存储起来了?? 编译器会在生成的代码中,有管理这个功能的相关二进制代码??(当然,源程序中怕是不会有这些代码的吧,否则也不会这么疑惑了) 那释放这段内存呢?? 意味着可以重新被申请这段地址空间???否则就不允许再申请这段空间???这段内存中的数据仍保留之前的状态?比如之前是0110010。
如果是c++,是不是因为有指针,也许会不小心因为某些操作又重新指向了这段地址从而出现错误??但java中,没有指针。是不是意味着只是内存空间的浪费?
还有,所谓的释放内存是什么概念呢?? 在程序的某段内存空间中标记此内存地址范围可用?? 还是把此内存地址范围都清零??比如之前的任何数据,都恢复为0000000。
c++ 申请了内存,堆上的空间不用时需要释放。
c# 堆上的对象实例占据的内存,在对象无效时,垃圾收集自动释放内存。 从所谓的原理上,我很理解。以前的一些变量,对象,占据了内存的空间。不用了,释放掉,清空“垃圾”的感觉。以后会仍然有较多的空间去用,不至于没有空间(内存溢出)的错误出现。 但是,不明白的是,所谓的申请内存与释放内存在 实际的内存中发生了什么呢?? 比如,0x10000-0x1FFFF的内存地址,被申请内存函数申请了。那么,该怎么理解这个申请了呢??
在释放之前,其他的函数不能再申请这段空间?? 这段空间的地址范围在内存的其他地方存储起来了?? 编译器会在生成的代码中,有管理这个功能的相关二进制代码??(当然,源程序中怕是不会有这些代码的吧,否则也不会这么疑惑了) 那释放这段内存呢?? 意味着可以重新被申请这段地址空间???否则就不允许再申请这段空间???这段内存中的数据仍保留之前的状态?比如之前是0110010。
如果是c++,是不是因为有指针,也许会不小心因为某些操作又重新指向了这段地址从而出现错误??但java中,没有指针。是不是意味着只是内存空间的浪费?
还有,所谓的释放内存是什么概念呢?? 在程序的某段内存空间中标记此内存地址范围可用?? 还是把此内存地址范围都清零??比如之前的任何数据,都恢复为0000000。
解决方案 »
- 求教正则
- 请教个程序问题!!!在线等。
- 一直对对象的方法的实现很模糊,大虾们指点下。。
- 求正则
- 软件在英文系统上打开报错0xc0000135!
- Asp.net有主函数main么,怎么设置首页?
- 怎么判断一个激活点(X0,Y0)是否在一个矩形区域内
- c#中怎么样控制屏幕???
- 怎样用RijndaelManaged类对二进制的数据进行加密?比如一个图片文件?
- 为enum写了一个扩展方法,用模板,编译失败了。错在哪里?
- Directory.GetCurrentDirectory() 方法和 Application.StartupPath 有什么不同
- MemberInfo[] info1=mtype.GetMembers(BindingFlags.Instance|BindingFlags.Public);如何对对象数组进行排序
清理的时候就是把那记录清掉罢了,好像是那么一回事,数据仍然会保存之前的状态的。
当中过程你可以在调试的时候跟踪new,一步一步跟踪下去,,嘿嘿,,一大堆的代码看得你头疼呀..
java中肯定也用到指针,不过不是我们可以用到的罢了。
希望对楼主能有所帮助。详情请参阅操作系统原理。清华出版社有一版不错的。
当你使用malloc, Java/C#的new操作符"申请"内存时, 操作系统会尝试在堆上找出连续的内存页面, 直到总的内存大小符合你的需要, 然后改变这些内存页面信息, 将属性设置为你的程序可读写. 这样, 你就能"使用"这段内存.释放内存, 就是通知操作系统重新设置内存页面的属性, 操作系统可以考虑讲这块内存分配给其他程序. 至于内存上保存的数据会不会马上"清楚", 这取决于操作系统设计.