垃圾回收与非垃圾回收编程语言

17

如果我理解正确,垃圾回收会自动释放程序不再使用的对象,就像Java中的垃圾收集器。

我听说在不支持垃圾回收的语言(比如C语言)中,程序可能存在内存泄漏,并最终耗尽内存。

那么,在不支持垃圾回收的语言(比如C语言)中,程序员会犯哪些错误呢?我猜测是没有在不再使用对象后释放它们。但是,由于缺少垃圾收集器,这是我们唯一可能犯的错误吗?


1
在垃圾回收环境中,您仍然可能会出现“过度根对象”的泄漏。也就是说,这些对象仍然被强引用,但您不再需要它们。 - bbum
11个回答

-3
请在讨论垃圾回收时,不要将面向对象语言(Java、C#)与非面向对象语言(C)进行比较。面向对象语言(大多数情况下)允许您实现GC(请参见智能指针的注释)。是的,它们并不容易,但它们非常有帮助,并且它们是确定性的。
此外,在考虑除内存之外的资源(例如文件、网络连接、DB连接等)时,GC语言与非GC语言如何比较...
我认为留给读者回答这个问题也会使事情更加清晰。

2
C语言也有垃圾回收机制(可以查看Boehm GC)。面向对象和非面向对象并不是特别重要。几乎所有的函数式语言都有垃圾回收机制,无论它是否是面向对象的函数式混合体。此外,智能指针有点像穷人版垃圾回收机制。 - Chuck
具体而言,智能指针方案无法处理垃圾循环。 - Stephen C
忘记了函数编程语言。谢谢提醒。 - Richard
1
SP!= GC。GC通常涉及查找和回收未使用的内存的主动过程。SP是一种将RAII语义扩展到堆的被动机制。它们都是自动内存管理的形式,但垃圾回收与智能指针明显不同。Java中的常规“指针”(即引用)在任何方面都不像C++智能指针那样“智能”。 - James Schek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接