为什么要使用垃圾收集器?

B.G*_*ill 18 c garbage-collection

可能重复:
C++中的垃圾收集 - 为什么?

嗨,我读了几篇关于垃圾收集器的文章,还有一件事我不明白 - 为什么要使用垃圾收集?

我会试着解释一下我的想法:

垃圾收集器应该在不需要的情况下将动态分配的内存释放回系统,对吧?所以,如果你用C语言编写程序,你就知道你需要一些内存,所以如果没有,你可以简单地销毁它.

那么,为什么要使用GC,当你需要做的事实上只是明智的内存分配/释放?或者我错过了什么?谢谢.

Mar*_*man 19

提高工作效率.换句话说,程序员可以专注于编写对于他的特定问题唯一的位.


Edw*_*uck 13

为了避免错误.无论你如何谨慎地解除内存释放,你最终都会犯错误,或者你最终会编写一个需要复杂内存参考模式的程序,这会使错误的可能性大得多.

任何给定足够时间存在的可能性都将成为现实,最终你会用手动方法泄漏内存,除非特别注意监视内存消耗.这种额外的努力会浪费时间从编码到程序的主要目的,这可能不是为了管理内存.

此外,即使您的程序没有泄漏内存,垃圾收集往往比许多非垃圾收集方法更有效地处理内存.大多数人不会new阻止多个对象,以避免多次new调用,也不会在之后重新访问和清理未使用的newed对象的缓存.大多数手动垃圾收集方法都集中在块边界释放内存,这可能会让垃圾比需要的时间更长.

您在手动垃圾收集上添加的每个附加好处和功能都使您更接近自动垃圾收集.使用没有实用程序来收集手动调用之外的垃圾来释放它将无法轻松扩展.您要花费大量时间检查内存分配/重新调整,否则您将不会花费足够的时间来避免内存泄漏.

无论哪种方式,自动垃圾收集为您解决了这个问题,让您回到程序的主要点.

  • +1.处理(非平凡)程序中的垃圾(a)手动执行时需要很长时间才能写入,(b)手动执行时很难正确执行,(c)有很好的自动解决方案.在编程的所有事情中,垃圾收集是真正应该自动化的事情之一! (5认同)
  • @Steve"然而垃圾收集的语言仍然可以泄漏内存......"实际上,垃圾收集语言从不泄漏C/C++意义上的内存,而是人们重新定义内存泄漏是什么,然后以新的方式应用相同的术语.在C/C++中,你会遇到这样一种情况:你不能随意走遍所有内存而无法到达泄露的内存(如果你能找到它,你可能无法将其重新放回到正确的数据结构中).在Java中,内存不会泄漏,而糟糕的程序员永远不会停止使用不需要的内存(他们称之为"内存泄漏"). (3认同)
  • @Steve,dereferncing!=释放记忆.失败模式非常不同.如果我不小心释放了其他人正在使用的内存,程序会崩溃.如果我不小心取消引用其他人正在使用的内存,程序将继续.重复使用术语来表示其他内容是不可取的,只需看看版权侵权==盗窃误解.盗窃要求您非法剥夺某人的财产,以防止他们使用它,而不是因为他们继续使用它(向您出售)可能会剥夺他们未来可能的利润. (2认同)

Tur*_*ete 10

因为我们不再生活在80年代初了.这是浪费开发人员的时间,当您即将创建一个惊人的应用程序时,关心最低级别的任务是非常烦人的.

  • 我不在C++中使用垃圾收集器,也不浪费时间担心内存. (5认同)
  • @GMan是的,我知道很多人也不担心记忆.这是他们的混乱,我们其他人必须清理. (3认同)
  • @Andres @user:`vector`不需要任何混乱,也不用担心.如果你想把它称为垃圾收集,这很好,但这是一个非常广泛的定义. (2认同)

swe*_*egi 8

因为我们不够聪明.


JUS*_*ION 8

当我编写程序时,我喜欢专注于我的问题领域,而不是关注不相关的实现细节的细节.例如,如果我正在编写Web服务器,我的问题域是网络连接,协议,数据传输/接收等,而不是内存分配和释放.如果我正在编写视频游戏,我的问题域是图形性能,也许是AI,而不是内存分配和释放.

任何时候我花在处理不属于我的问题域的事情上都浪费时间,可以花在我的问题域上.通过专注于低级细节,换句话说,我实际工作的质量 - 我实际上试图解决的问题 - 遭受了损失.

此外,你的"所有你需要做的事实上只是明智的内存分配/释放"位只能突出两种可能性(我能想到,无论如何):

  1. 你很缺乏经验.
  2. 你可能 - 潜在地下意识地 - 削弱了你的设计,使它们不受你对内存管理的简单假设的限制.

在现实世界中的软件内存管理是一个决定性的 -trivial努力.任何大小的现代软件中典型的复杂数据结构在确定任何给定的动态分配存储器的"活性"和"所有权"方面导致令人难以置信的混淆.随着线程的引入,或者更糟糕的是,对于任何形式的共享状态的多处理(对称的和其他的),这变得更加复杂(可能是数量级).

在非托管内存环境中编写的软件中最常见的错误与管理不善的动态分配内存有关,这绝非偶然.

那为什么要使用垃圾收集?因为在处理动态分配的内存的变幻莫测时,你并不像你想象的那么聪明.真的,你不是.不管你认为自己有多聪明.如果您认识到自己并不聪明,那么您的设计就会瘫痪,以保持您的内存管理简单易懂.但是,如果你傲慢地相信你可以处理任何事情,那么你只需要让那些必须处理你的蹩脚,易崩溃和/或内存食用软件的用户搞砸.


Nic*_*unt 5

考虑两个独立子系统使用特定指针的情况.一个子系统可以用变量来完成,程序员可能会想,"我已经完成了这个,我将继续并释放它",完全没有意识到另一个子系统仍然需要访问它.或者另一个陷阱,开发商认为,"我不知道是否有可能需要这个另一子系统"(即使没有),导致内存泄漏.这种情况在复杂的系统中出现了很多.