使用:
实例化对象时Foo objFoo = new Foo();
当重新分配引用objFoo
时,内存分配会发生什么变化?
objFoo = new Foo();
分配给null时怎么样?
objFoo = null
答案 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什么时候会释放内存。