实际上,不,这不会发生。覆盖刚刚释放的内存需要花费时间,因此会有性能损失。“安全”之类的物体SecureString的都只是擦自己,而不是依靠GC。
更广泛地讲,它在很大程度上取决于该特定语言的特定实现。每种假定存在GC的语言(例如C#)都指定了有关如何以及何时进行垃圾回收的不同规则。
以您的C#为例,C#规范不要求对象在被释放后被覆盖,并且也不禁止它:
最终,在对象符合收集条件的某个时候,垃圾收集器释放了与该对象关联的内存。
§3.9C#5.0语言规范
如果以后将内存分配给引用类型,则将有一个构造函数来执行您自己的自定义初始化。如果以后将内存分配给值类型,则将其清零,然后才能开始从中读取:
初始化为默认值通常是通过在分配内存之前让内存管理器或垃圾收集器将内存初始化为全零位来完成的。因此,使用全零位来表示空引用很方便。
§5.2C#5.0语言规范
另外,至少有两个C#实现-微软的实现和Mono的实现,因此仅说“ C#”还不够具体。每个实现可能决定覆盖内存(或不覆盖)。