当我将变量设置为新对象时,旧值是否会死亡?

时间:2011-02-10 04:25:15

标签: .net vb.net garbage-collection scope

假设我有一个变量List(Of T),其中有100个元素是类的实例....

如果我将此变量设置为另一个100个实例的新List(Of T),那么旧的变量完全消失了,对吧?他们死。绝对是过去的事,对吗?

5 个答案:

答案 0 :(得分:5)

假设没有其他东西指向那100件事,那么是的,他们有资格进行垃圾收集。

答案 1 :(得分:2)

除非列表中的对象被其他任何内容引用/引用,否则它们将被用于Garbage Collection

  

.NET Framework的垃圾收集器   管理分配和发布   内存为您的应用程序。每一次   你创建一个新的对象,常见的   语言运行库为内存分配内存   托管堆中的对象。如   只要地址空间可用   托管堆,运行时   继续为新的空间分配空间   对象。但是,记忆不是   无穷。最终垃圾   收藏家必须执行收藏   为了释放一些记忆。垃圾   收藏家的优化引擎   确定执行a的最佳时间   集合,基于分配   正在制作当垃圾   收藏家执行一个集合,它   检查托管堆中的对象   不再被使用的   申请并执行必要的   回收记忆的行动。

答案 2 :(得分:1)

是的,你在内存中为变量声明了一个新的位置,旧的引用会在一段时间内被垃圾收集丢失和清理。

答案 3 :(得分:1)

正如其他人所说,垃圾收集应该开始。但是,由于您无法控制何时发生,因此数据可能仍在内存中。最坚定的人可能会找到它。

如果你绝对关心内存窥探,只需使用一个循环将每个元素的值设置为0或随机值。

答案 4 :(得分:0)

不一定。 CLR(执行C#和VB.net代码的运行时)是垃圾收集系统。运行时将定期检查内存中的对象,确定哪些对象无法从“根集”(例如,包括堆栈中的局部变量)到达,并释放它们。

在您的示例中, if 没有其他变量或字段包含对列表的引用(也可以从根集中访问),然后将释放原始List。此外,如果释放了List,并且如果,则列表中的每个元素都没有剩余的实例,那么这些元素也将被释放。但是,对列表中单个元素的引用不会阻止列表本身或列表中的任何其他元素被释放。