在无限循环中创建的对象的垃圾收集

Ame*_*mey 6 c# garbage-collection

我有一个非常基本的问题.

我写了一个这样的循环:

while(true)
{
   MyTestClass myObject = new MyTestClass();
}
Run Code Online (Sandbox Code Playgroud)
  1. 什么时候会在循环中创建对象,垃圾收集?
  2. 此外,对于每次迭代,是否将新内存位置分配给myObject引用?
  3. 如果我myObject = null;在每次迭代结束时写下怎么办?

Mar*_*ell 10

  1. 好吧,只要GC感觉像这样,坦白说; 永远不会读取变量,因此始终符合条件
  2. myObject变量 - 在堆栈上有一个固定的位置供参考; 但是,每个new MyTestClass()都是一个不同的对象,在可用堆空间的某处创建; 每次都不一样
  3. 没有任何区别; 严格来说,有一些复杂性涉及变量的实际声明点(在IL中)以及如何while实际实现 - 但这只会在退出循环后显示.因为在每次迭代中你都会立即分配它,所以这里没有明显的区别


Tim*_*son 5

什么时候会在循环中创建对象,垃圾收集?

在最后一次引用之后的某个时刻被移除.在每次循环迭代中创建并删除新引用,因此GC可以在需要时自由地收集这些对象.实际上,当你的程序完全填满零代时,很可能会发生这种情况.

此外,对于每次迭代,是否将新内存位置分配给myObject引用?

是.

如果我myObject = null;在每次迭代结束时写下怎么办?

它没有任何区别.设置myObject = null;将删除对该对象的引用,但myObject在下一次循环迭代中重新分配变量时,无论如何都会删除引用.

  • 只是重申你的观点; 在IL级别(这是GC关心的),范围不存在,并且在IL前导码中声明了`myObject`(假设它没有被捕获),因此存在(作为具有值的"本地")整个方法的持续时间.离开(C#)范围时未明确清除.简单地说:从来没有读过这一点. (3认同)