我不断听到人们抱怨 C++ 没有垃圾回收功能。
我很为他们感到难过。严重地。
C++ 有 RAII,但我总是抱怨在垃圾收集语言中找不到 RAII(或阉割过的 RAII)。
垃圾收集可以为经验丰富的 C++ 开发人员提供哪些优势?
另一个工具。
Matt J 在他的帖子中写得非常正确(C++ 中的垃圾收集——为什么? https://stackoverflow.com/questions/228620/garbage-collection-in-c-why#228640):我们不需要 C++ 功能,因为它们中的大多数都可以用 C 进行编码,并且我们不需要 C 功能,因为它们中的大多数可以用汇编进行编码,等等。C++ 必须不断发展。
作为开发人员:我不关心 GC。我尝试了 RAII 和 GC,我发现 RAII 优越得多。正如格雷格·罗杰斯在他的帖子中所说(C++ 中的垃圾收集——为什么? https://stackoverflow.com/questions/228620/garbage-collection-in-c-why#228670),内存泄漏并没有那么可怕(至少在 C++ 中,如果真正使用 C++,内存泄漏很少见),以至于证明 GC 而不是 RAII 是合理的。 GC 具有不确定性的释放/终结,只是一种方法编写不关心特定内存选择的代码.
最后一句话很重要:编写“只是不关心”的代码很重要。同样,在 C++ RAII 中,我们不关心资源释放,因为 RAII 为我们做这件事,也不关心对象初始化,因为构造函数为我们做这件事,有时只编码而不关心谁是内存的所有者是很重要的,以及这段或这段代码需要什么样的指针(共享、弱等)。C++中似乎需要GC。(即使我个人看不到)
在 C++ 中良好使用 GC 的示例
有时,在应用程序中,您有“浮动数据”。想象一下数据的树状结构,但没有人真正是数据的“所有者”(并且没有人真正关心数据何时会被销毁)。多个对象可以使用它,然后丢弃它。您希望当没有人再使用它时将其释放。
C++ 方法使用智能指针。我想到了 boost::shared_ptr 。所以每条数据都由它自己的共享指针拥有。凉爽的。问题在于,当每一条数据都可以引用另一条数据时。您不能使用共享指针,因为它们使用引用计数器,而引用计数器不支持循环引用(A 指向 B,B 指向 A)。所以你必须知道思考很多关于在哪里使用弱指针(boost::weak_ptr),以及何时使用共享指针。
使用 GC,您只需使用树形结构数据。
缺点是你不能在意when“浮动数据”真的会被破坏。仅此而已will be被毁了。
结论
所以最后,如果做得正确,并且与 C++ 的当前习惯用法兼容,GC 将是一个C++ 的另一个好工具.
C++ 是一种多范式语言:添加 GC 或许会让一些 C++ 粉丝因叛国而哭泣,但最终,这可能是一个好主意,我想 C++ 标准委员会不会让这种重大功能破坏语言,因此我们可以相信他们会做出必要的工作来启用正确的 C++ GC,而不会干扰 C++:与 C++ 中的一贯做法一样,如果您不需要某个功能,就不要使用它,它不会花费您任何费用。