C#重新分配类后内存会发生什么

时间:2012-04-19 06:24:26

标签: c# garbage-collection

在展示一个例子之后提问这个问题会更容易......

MyClass a = new MyClass();

a.initializeData();
a = new MyClass();

为新的MyClass分配空间后,我以前的分配会发生什么?垃圾收集器是否自动收集它,因为我知道C#中没有删除

我只是想确保我不会有任何内存泄漏。

谢谢!

5 个答案:

答案 0 :(得分:1)

稍后将从垃圾收集器中释放孤立类的内存。

请参阅This article

答案 1 :(得分:1)

首先,它被称为“创建一个对象”,而不是“重新分配一个类”。

垃圾收集的整个想法是你不关心你没有引用的对象会发生什么:你的代码好像有无限的内存(在合理范围内)。垃圾收集器的目的不是为你释放内存,it is to simulate that there is an infinite amount of memory

恰好,为了做到这一点,垃圾收集器可能会回收以前分配的内存,而您不时不会引用该内存;它还可能重新组织已用内存以防止碎片,并更新所有引用以指向新的内存位置。所有这些都是您不应该关注的实施细节。

当然,了解GC的工作原理非常有趣。 :)

答案 2 :(得分:0)

垃圾收集器正在跟踪引用,因为没有引用它将在以后收集的第一个实例。

答案 3 :(得分:0)

假设您的程序运行时间足够长,并且在将来的某个时间点存在足够的内存压力或发生显式垃圾收集,那么将收集MyClass的第一个实例(或者将其放入终结器队列,如果它有终结器)。

当发生这种情况时,你不应该担心可能发生的最早时间是initializeData正在执行,之后该方法已经停止通过this访问任何实例成员(无论是隐式还是显式)。


显式垃圾收集:您不应该在基准测试或代码演示特定GC行为之外执行此操作。

答案 4 :(得分:0)

是的,垃圾收集器负责删除未使用的对象。

当发生这种情况时无法保证,但由于它是一个短暂存在的对象,它通常会在下一次垃圾收集时发生。

如果需要控制清除对象的时间(即在类中使用非托管资源),则实现IDisposable接口,并调用Dispose方法告诉对象清理资源。