memory-management - 为什么在垃圾回收语言中不允许使用free()?

标签 memory-management garbage-collection free

我正在阅读Wikipedia上的C#条目,发现:


无法显式释放托管内存;相反,它是自动垃圾收集的。


为什么在具有自动内存管理功能的语言中甚至不允许手动管理?我可以看到,在大多数情况下,这是没有必要的,但是在您内存紧张且不想依靠GC聪明的情况下,它是否派上用场?

最佳答案

垃圾回收通过确保内存分配永远不会出现别名来增强内存分配器的类型安全性。也就是说,如果当前将一块内存视为类型T,则内存分配器可以保证(带有垃圾回收)在该引用有效的同时,它始终引用T。更具体地说,这意味着内存分配器将永远不会以其他类型返回该内存。

现在,如果内存分配器允许手动使用free()并使用垃圾回收,则必须确保您的free()所使用的内存没有被其他任何人引用。换句话说,您传递给free()的引用是对该内存的唯一引用。在大多数情况下,对free()进行任意调用时,这样做的成本过高,因此,大多数使用垃圾回收的内存分配器都不允许这样做。

这并不是说不可能。如果您可以表达单引荐类型,则可以手动进行管理。但是到那时,停止使用GC语言或根本不用担心它会更容易。

关于memory-management - 为什么在垃圾回收语言中不允许使用free()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766297/

相关文章:

c - Malloc-释放后使用内存未触发错误

C99:从堆中释放后返回一个值

c - 分配动态二维字符数组

java - 静态方法中的局部变量也是静态的吗?

Java 垃圾收集器说明

c - 释放堆内存后将指针设置为 NULL

Javascript:内存不足

java - 在 Java 堆之外分配的巨大内存

c# - 静态属性最终会出现在 gen2 中吗?

java - 永久代总是在 HotSpot VM 上连续收集吗?