首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于垃圾回收机制的有关问题

2012-02-12 
关于垃圾回收机制的问题有一个问题一直搞不清!假如我创建了一个全局的ArrayList,主要用其做为一个容器来管

关于垃圾回收机制的问题
有一个问题一直搞不清!
假如我创建了一个全局的ArrayList,主要用其做为一个容器来管理对象,而对象是在一个过程中创建的!
问题:
对于不具有垃圾回收机制的语言来说,比较好理解,即把对象的堆地址传给ArrayList,而出了这个过程(或作用域),栈指针释放,这时我们还可用ArrayList中的指针可以直接访问堆中的数据。
var
  A:TObject;//声明一个栈数据,出此过程A将被释放
begin
  ArrayList.add(A)//把栈数据传给ArrayList,但堆数据没有被释放!
end;

对于具有垃圾回收机制的语言来说,出了过程,堆与栈中的数据
var
A:TObject;//声明一个栈数据,出此过程A将被释放
begin
ArrayList.add(A)//把栈数据传给ArrayList,出了作用域堆与栈的数据都将被清空??????那不是会引起AV错误????垃圾回收是如何定性一个变量是否没被使用的?
end;


另:
我怎么能看到.net 系统类实现的源码,我用查看实现功能仅能看到声明的过程,没源码!
能不能像Delphi的VCL一样能看到类实现层面的源码!


[解决办法]
我觉得变量的生命周期在c++和C#中总区别不大吧...
关于存放的位置似乎不会影响回收时间..
net不是开源的,而且是托管的,垃圾回收过程封装好了,源码的话现在08里经过授权可以查看相关类库的源码
[解决办法]
ArrayList本省是一个引用类型。
你定义的是一个全局变量。在程序没有结束前,ArrayList本身不会参与回收。
ArrayList中所包含的对象,如果你没有显示的销毁,那么也不会被回收。
垃圾回收机制是指,在已经结束的作用域中所定义的数据,如果用户没有主动回收,那么回收机制会帮助你回收掉,但是这个回收不是实时的。通过计数和排序算法来实现的。具体算法不知道,好像也还复杂。
[解决办法]
纠正一下,全局类型在C#里面是没有的,应该是在ArrayList的生命期里面
3楼是对的,在你的对象创建以后,垃圾回收器是会维护一个对象引用列表的,你的每个对象都会有个引用计数,表示你这个对象有其他对象引用着,不能被收集。垃圾收集器会定期的扫描这个表,那些没有对象引用的对象将会被列在一个垃圾收集的范围内,或许会被收集(不会立即收集,只是标识了,深入了解请查看一下Generation的概念)。

探讨
ArrayList本省是一个引用类型。
你定义的是一个全局变量。在程序没有结束前,ArrayList本身不会参与回收。
ArrayList中所包含的对象,如果你没有显示的销毁,那么也不会被回收。
垃圾回收机制是指,在已经结束的作用域中所定义的数据,如果用户没有主动回收,那么回收机制会帮助你回收掉,但是这个回收不是实时的。通过计数和排序算法来实现的。具体算法不知道,好像也还复杂。

[解决办法]
源码还在MS手里··
对象过了生存期当然就被销毁了,
只有手动回收的时候,GC会根据这个对象还有没有对它的引用来判断是否销毁,一旦像你说的过了生存期肯定就被delete了,

[解决办法]
引用楼主 xeqtrl982 的帖子:
var
A:TObject;//声明一个栈数据,出此过程A将被释放

[解决办法]
探讨


这一行只是在栈上分配了一个引用,也就是相当于指针,并不是对象本身。所以在退出这个Scope之后,销毁的只是那个引用,而不是引用的堆上的对象。

热点排行