为什么垃圾收集语言中不允许free()?

sun*_*ica 17 free garbage-collection memory-management

我正在阅读维基百科上的C#条目,并遇到:

无法明确释放托管内存; 相反,它会自动被垃圾收集.

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

Phi*_*ler 10

具有自动内存管理功能的语言旨在提供在存在任何手动内存管理时无法提供的大量内存安全保证.

预防的问题包括:

  • free()小号
  • 调用free()指向您不拥有的内存的指针,导致在其他地方非法访问
  • 调用free()一个不是分配函数返回值的指针,例如获取堆栈中某个对象的地址,或者在数组或其他分配的中间.
  • 解引用指向内存的指针已经被free()ð

此外,当GC将活动对象移动到合并区域时,自动管理可以带来更好的性能.这改善了引用的局部性并因此改善了缓存性能.

  • 仅当Dispose实现编码错误时 (3认同)

MSN*_*MSN 5

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

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

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