| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1870 人关注过本帖
标题:释放?不释放?实践是检验真理的唯一标准
取消只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用TonyDeng在2012-8-11 14:15:14的发言:

正如我前面所说,宣布废弃不用与执行垃圾回收资源整理是两回事,是不同步的,通常在程序结束后才集体释放。传统C程序最头痛的就是内存碎片,自己很难整理回收的,但早期运行在实模式下的Windows 3.x版本居然克服了这个困难,自己可以进行资源整理工作(此时程序反应延迟,道理与当今回收资源时系统变慢是一样的),是相当了不起的。现在已经由操作系统来负责处理了,程序只是在需要丢弃的内存处打个标志,告知操作系统此处已不用,听由另外安排即可,至于系统什么时候用到,是不管的。事实上,所谓free()释放指针的内存,也是打个标志,所以free()中的指针必须是当初malloc()返回的那个地址,就是为了打标志用的,如果运气好,释放了的内存没有被挪作他用,使用废弃指针仍然能找到过往的数据(事实上以前真有这样写程序的人,free()之后马上*一下在某种程度上可以作为返回值使用)。

C/C++的内存运用函数,全部都是调用操作系统API的,操作系统怎么分配和怎么管理内存,应用程序控制不了,它只能按自己的设想运作,即宣布废弃了就绝不再去访问,编译器遵守这种假定检查你的代码,但实际运行又是另一回事(这与const常量仍然可以被修改是同理)。当今,.NET的gc内存管理器能够确保绝对没有内存泄漏,分配了的指针不主动释放也不会有事,而且为了高效运作,gc自动回收垃圾也只回收一代垃圾(即只使用过一次的数据),只有在堆碎片实在太凌乱时,才会执行压缩处理,此时程序要变慢,因为需要把所有指针的指向重新整理一次,所以在这种管理制度下,使用指针地址访问数据是很危险的事,因为你不知道什么时候数据的地址变了。

大牛说的很好 就是感觉有点跑题。。
2012-08-11 14:51
快速回复:释放?不释放?实践是检验真理的唯一标准
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016081 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved