| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1870 人关注过本帖
标题:释放?不释放?实践是检验真理的唯一标准
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
信箱 你也跑的太快了吧 我要锥你啦

梅尚程荀
马谭杨奚







                                                       
2012-08-10 22:13
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我就喜欢讨论这些概念性的问题。有关分配和释放的时机问题,C99 标准只字未提:
6.2.4 Storage durations of objects
2 The lifetime of an object is the portion of program execution during which storage is
  guaranteed to be reserved for it. An object exists, has a constant address, and retains
  its last-stored value throughout its lifetime. If an object is referred to outside of its
  lifetime, the behavior is undefined....
翻译:
6.2.4 对象的储存期
2 对象的生命期是指期其储存空间被保证保留的程序执行过程部分。一个对象存在,占有一个
  固定的地址,并在整个生命期内维护它最后的存储值。在生命期外引用一个对象是未定义行为。
之后标准用了一些篇幅,诠释各个对象的生命期是什么。

注意标准的用语,生命期是保证对象储存空间存在的时期。也就是说,对象可以在生命期开始的那一刹那分配,在消失的那一刹那回收。也可以不是,但储存的只能比这个长,不能比这个短。
事实上现在一般的实现,在执行权转入函数时统一分配局部变量,转回时统一回收都是符合标准的做法。当然也可以有其它做法,不过一般都要权衡相应行为代价。


[ 本帖最后由 pangding 于 2012-8-10 22:55 编辑 ]
2012-08-10 22:52
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pangding在2012-8-10 22:52:37的发言:

我就喜欢讨论这些概念性的问题。有关分配和释放的时机问题,C99 标准只字未提:
翻译:
之后标准用了一些篇幅,诠释各个对象的生命期是什么。

注意标准的用语,生命期是保证对象储存空间存在的时期。也就是说,对象可以在生命期开始的那一刹那分配,在消失的那一刹那回收。也可以不是,但储存的只能比这个长,不能比这个短。
事实上现在一般的实现,在执行权转入函数时统一分配局部变量,转回时统一回收都是符合标准的做法。当然也可以有其它做法,不过一般都要权衡相应行为代价。

这些和我一直以来的理解是一致的 标准万岁
2012-08-10 22:57
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
我擦 这是唱哪出

别逼我再把汇编找出来看
2012-08-10 23:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用demonleer在2012-8-10 23:10:59的发言:

我擦 这是唱哪出
 
别逼我再把汇编找出来看

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

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

[ 本帖最后由 TonyDeng 于 2012-8-11 14:34 编辑 ]

授人以渔,不授人以鱼。
2012-08-11 14:15
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
哇咔咔 向大牛们学习!

梅尚程荀
马谭杨奚







                                                       
2012-08-11 14:33
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
jokerbat
Rank: 2
等 级:论坛游民
帖 子:77
专家分:91
注 册:2012-2-1
收藏
得分:0 
有点难度啊 ,我一般看不懂
我来垫底吧
2012-08-11 15:03
快速回复:释放?不释放?实践是检验真理的唯一标准
数据加载中...
 
   



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

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