B.G*_*ill 18 c garbage-collection
可能重复:
C++中的垃圾收集 - 为什么?
嗨,我读了几篇关于垃圾收集器的文章,还有一件事我不明白 - 为什么要使用垃圾收集?
我会试着解释一下我的想法:
垃圾收集器应该在不需要的情况下将动态分配的内存释放回系统,对吧?所以,如果你用C语言编写程序,你就知道你需要一些内存,所以如果没有,你可以简单地销毁它.
那么,为什么要使用GC,当你需要做的事实上只是明智的内存分配/释放?或者我错过了什么?谢谢.
Edw*_*uck 13
为了避免错误.无论你如何谨慎地解除内存释放,你最终都会犯错误,或者你最终会编写一个需要复杂内存参考模式的程序,这会使错误的可能性大得多.
任何给定足够时间存在的可能性都将成为现实,最终你会用手动方法泄漏内存,除非特别注意监视内存消耗.这种额外的努力会浪费时间从编码到程序的主要目的,这可能不是为了管理内存.
此外,即使您的程序没有泄漏内存,垃圾收集往往比许多非垃圾收集方法更有效地处理内存.大多数人不会new阻止多个对象,以避免多次new调用,也不会在之后重新访问和清理未使用的newed对象的缓存.大多数手动垃圾收集方法都集中在块边界释放内存,这可能会让垃圾比需要的时间更长.
您在手动垃圾收集上添加的每个附加好处和功能都使您更接近自动垃圾收集.使用没有实用程序来收集手动调用之外的垃圾来释放它将无法轻松扩展.您要花费大量时间检查内存分配/重新调整,否则您将不会花费足够的时间来避免内存泄漏.
无论哪种方式,自动垃圾收集为您解决了这个问题,让您回到程序的主要点.
Tur*_*ete 10
因为我们不再生活在80年代初了.这是浪费开发人员的时间,当您即将创建一个惊人的应用程序时,关心最低级别的任务是非常烦人的.
当我编写程序时,我喜欢专注于我的问题领域,而不是关注不相关的实现细节的细节.例如,如果我正在编写Web服务器,我的问题域是网络连接,协议,数据传输/接收等,而不是内存分配和释放.如果我正在编写视频游戏,我的问题域是图形性能,也许是AI,而不是内存分配和释放.
任何时候我花在处理不属于我的问题域的事情上都浪费时间,可以花在我的问题域上.通过专注于低级细节,换句话说,我实际工作的质量 - 我实际上试图解决的问题 - 遭受了损失.
此外,你的"所有你需要做的事实上只是明智的内存分配/释放"位只能突出两种可能性(我能想到,无论如何):
在现实世界中的软件内存管理是一个决定性的非 -trivial努力.任何大小的现代软件中典型的复杂数据结构在确定任何给定的动态分配存储器的"活性"和"所有权"方面导致令人难以置信的混淆.随着线程的引入,或者更糟糕的是,对于任何形式的共享状态的多处理(对称的和其他的),这变得更加复杂(可能是数量级).
在非托管内存环境中编写的软件中最常见的错误与管理不善的动态分配内存有关,这绝非偶然.
那为什么要使用垃圾收集?因为在处理动态分配的内存的变幻莫测时,你并不像你想象的那么聪明.真的,你不是.不管你认为自己有多聪明.如果您认识到自己并不聪明,那么您的设计就会瘫痪,以保持您的内存管理简单易懂.但是,如果你傲慢地相信你可以处理任何事情,那么你只需要让那些必须处理你的蹩脚,易崩溃和/或内存食用软件的用户搞砸.
考虑两个独立子系统使用特定指针的情况.一个子系统可以用变量来完成,程序员可能会想,"我已经完成了这个,我将继续并释放它",完全没有意识到另一个子系统仍然需要访问它.或者另一个陷阱,开发商认为,"我不知道是否有可能需要这个另一子系统"(即使没有),导致内存泄漏.这种情况在复杂的系统中出现了很多.