Gyö*_*sek 6 language-agnostic garbage-collection raii
虽然我认为我理解问题的要点(即一个好的GC跟踪对象,而不是范围),但我不太了解该主题以说服其他人.
你能否解释为什么没有垃圾收集语言和确定性析构函数?
它们并不相互排斥。请随意将 C++ 与 libgc(Boehm-Reiser-Detlefs 收集器)一起使用。您仍然可以使用 RAII、智能指针和手动删除,但随着 GC 的运行,您也可能“忘记”删除某些对象。
@Andy 关于资源处置得太晚的回答忽略了重要的一点:语义上至关重要的不是延迟释放资源,而是释放的顺序。
GC 往往不能很好地对释放进行排序的原因是,它需要对排序要求(依赖项)进行拓扑排序,而这是一种昂贵的算法。
尽管如此,Ocaml GC 有一个有趣的功能,您可以将终结器附加到对象。如果该对象变得不可访问,则终结器将运行,但该对象不会被删除(因为终结器可以使其再次可访问:在这种情况下,您甚至可以附加另一个终结器)。这些终结器可以提供对排序的一些控制。