在展示一个例子之后提问这个问题会更容易......
MyClass a = new MyClass();
a.initializeData();
a = new MyClass();
为新的MyClass分配空间后,我以前的分配会发生什么?垃圾收集器是否自动收集它,因为我知道C#中没有删除
我只是想确保我不会有任何内存泄漏。
谢谢!
答案 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
方法告诉对象清理资源。