1

举个例子后问这个问题更容易......

MyClass a = new MyClass();

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

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

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

谢谢!

4

5 回答 5

1

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

这篇文章

于 2012-04-19T06:25:48.627 回答
1

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

垃圾收集的整个想法是,您不关心没有引用的对象会发生什么:您编写的代码好像有无限的内存(在合理范围内)。垃圾收集器的目的不是为你释放内存,而是模拟有无限量的内存

碰巧的是,为了做到这一点,垃圾收集器可能会回收以前分配的内存,而您不时在这些内存上持有任何引用;它还可能重新组织使用的内存以防止碎片,并更新所有引用以指向新的内存位置。所有这些都是您不应该关心的实现细节。

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

于 2012-04-19T07:13:30.623 回答
0

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

于 2012-04-19T06:26:26.697 回答
0

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

您不必担心何时会发生这种情况。最早可能发生在initializeData执行过程中,在该方法停止通过this(无论是隐式还是显式)访问任何实例成员之后。


显式垃圾收集:在基准测试或演示特定 GC 行为的代码之外,您永远不需要执行此操作。

于 2012-04-19T06:27:56.420 回答
0

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

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

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

于 2012-04-19T06:32:28.770 回答