重新分配对象时会发生什么?

时间:2016-01-22 13:12:54

标签: c# .net class object memory

使用:

实例化对象时
Foo objFoo = new Foo();

当重新分配引用objFoo时,内存分配会发生什么变化?

objFoo = new Foo();

分配给null时怎么样?

objFoo = null

3 个答案:

答案 0 :(得分:5)

  

当我们将另一个实例分配给对象时,当前正在使用的内存会发生什么。

objFoo是一个变量,而不是一个对象。

objFoo = new Foo();创建一个新对象(new Foo())并将其分配给objFoo变量。

如果您调用objFoo = new Foo();并且没有其他变量引用同一个旧对象,那么旧对象将有资格被垃圾收集。

垃圾收集不会立即发生,但一旦发生,它将释放旧对象使用的内存。

有关垃圾收集的更多信息,请查看this MSDN reference

  

将null分配给对象时,内存会发生什么。即。,objFoo = null

与我之前的笔记相同。如果没有其他变量引用旧对象,则该对象将有资格进行垃圾回收。

  

在第一种情况下,我可以访问新对象,在第二种情况下,访问值将为我提供空引用异常。

变量 objFoo现在没有引用任何内容,这就是当您尝试访问它所引用的对象时收到异常的原因。

答案 1 :(得分:2)

删除对象的最后一个引用(在这种情况下,通过将变量设置为 一个新对象或null,它基本上是相同的)它被标记为可以被垃圾收集。

这并不意味着内存会立即被释放(尽管可能会发生这种情况),所以如果你有一些非托管方式来访问内存,它仍会显示为"那里"一段时间。

在某些时候(你无法确定),内存被释放。

如果您有其他变量/列表等引用该对象,那么它就没有资格进行垃圾回收。

答案 2 :(得分:1)

开始时,objFoo包含对内存中第一个对象地址的引用。当您创建并分配第二个对象new Foo()时,它会在内存中创建一个新对象并将新引用放在objFoo中。旧代码,如果不再在代码中的其他位置引用,则成为垃圾收集器的候选对象。你没有“覆盖”内存,你只需要为新对象使用另一个内存范围。

对于你的第二点,它几乎是一样的。将空引用分配给objFoo变量时,如果没有其他变量引用它,则前一个对象将成为GC的候选对象。由于您的变量实际上引用了一个空值而不是内存中引用的有效Foo对象,因此会出现此错误。

在任何情况下,您都不确切知道GC什么时候会释放内存。