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

18

可能是重复的问题:
C++中的垃圾收集 - 为什么使用?

你好,我读了一些关于垃圾回收器的文章,但有一件事我仍然不明白 - 为什么要使用垃圾回收?

我来尝试解释一下我的想法:

垃圾回收器应该会在没有需要时释放动态分配的内存,对吧?那么,如果你用 C 语言编写程序,你知道是否需要某个内存块,如果不需要,就可以直接销毁它。

那么,既然只需要明智地管理内存分配和释放,为什么还要使用垃圾回收呢?或者是我漏掉了什么重要的东西吗?谢谢。


26
一切都在于“明智决策”。 - mouviciel
7
因为程序员很懒。 - ericvg
一个相关的线程:https://dev59.com/rHE85IYBdhLWcg3w02_z - Péter Török
13
如果我足够聪明,在所有情况下都能正确地管理内存,那么我会用令人惊叹的洛杉矶修辞和深刻的见解来回答问题,而不是发表这条评论。总体情况下,内存管理非常困难。 - David Thornley
2
@b-gen-jack-o-neill:我觉得你已经回答了自己的问题。这不是必要的。一个足够小心的程序员可以手动管理资源,并且可以做得很好。当然,如果你完成了一个资源,立即释放它可能是有优势的(有时候不释放反而更高效!)。但是不用担心这个问题让开发者有更多时间处理更重要的问题。个人而言,我更喜欢C++风格的“智能指针”,它是手动和GC之间的一个不错的折中方案,因为它确定了何时会释放资源。 - Evan Teran
显示剩余4条评论
22个回答

0

您需要尽快释放Interop资源(锁定文件)。 Gc.Collect可以确保COM对象被释放(如果没有引用)。

如果您进行PrintPreview,每个页面需要2个Gdi句柄(图像+元文件)。 这些资源不会被PrintDocument或PrintControler释放,而是等待GC。

我在交互式程序上测试了在用户返回主菜单时使用Gc.Collect的操作。 通过此操作,任务管理器报告的内存约为50%。

我认为这并不重要,但是当您知道有很多内存未被引用时,编写Gc.Collect是一个简单的选择。


0

内存管理是实现问题,与程序的目标无关。

所谓程序目标,指的是业务逻辑等方面。

当你处理实现问题时,你会浪费时间和精力在那些对完成程序没有帮助的事情上。


一切都是实现问题。我认为商业程序的目标之一是加快业务速度。如果用户花费所有时间听硬盘咯吱作响,因为GC正在运行并强制交换数千个页面以检查可GC对象,那么这并不真正加快业务速度... - R.. GitHub STOP HELPING ICE
@R,你正在让两件事情相等,即加速程序=加速业务,即使可能(并且正在发生)快速的程序(强大的计算机)并不能使业务运行更快。 - Avram

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