举个例子后问这个问题更容易......
MyClass a = new MyClass();
a.initializeData();
a = new MyClass();
在为新的 MyClass 分配空间后,我之前的分配会发生什么?垃圾收集器是否会自动收集它,因为我知道 C# 中没有删除
我只是想确保我不会有任何内存泄漏。
谢谢!
举个例子后问这个问题更容易......
MyClass a = new MyClass();
a.initializeData();
a = new MyClass();
在为新的 MyClass 分配空间后,我之前的分配会发生什么?垃圾收集器是否会自动收集它,因为我知道 C# 中没有删除
我只是想确保我不会有任何内存泄漏。
谢谢!
孤立类的内存将在稍后从垃圾收集器中释放。
见这篇文章
首先,它被称为“创建一个对象”,而不是“重新分配一个类”。
垃圾收集的整个想法是,您不关心没有引用的对象会发生什么:您编写的代码好像有无限的内存(在合理范围内)。垃圾收集器的目的不是为你释放内存,而是模拟有无限量的内存。
碰巧的是,为了做到这一点,垃圾收集器可能会回收以前分配的内存,而您不时在这些内存上持有任何引用;它还可能重新组织使用的内存以防止碎片,并更新所有引用以指向新的内存位置。所有这些都是您不应该关心的实现细节。
当然,了解 GC 的工作原理是非常有趣的。:)
垃圾收集器正在跟踪引用,因为没有对稍后将被收集的第一个实例的引用。
假设您的程序运行了足够长的时间,并且在将来某个时间点有足够的内存压力或发生显式垃圾收集,那么MyClass
将收集 的第一个实例(或者将被放入终结器队列,如果它具有终结器)。
您不必担心何时会发生这种情况。最早可能发生在initializeData
执行过程中,在该方法停止通过this
(无论是隐式还是显式)访问任何实例成员之后。
显式垃圾收集:在基准测试或演示特定 GC 行为的代码之外,您永远不需要执行此操作。
是的,垃圾收集器负责删除未使用的对象。
无法保证何时会发生这种情况,但由于它是一个短暂的对象,它通常会在下一次垃圾回收时发生。
如果需要控制何时清理对象(即在类中使用非托管资源),则实现IDisposable
接口,并调用Dispose
方法告诉对象清理资源。