Это главный недостаток традиционных reference counting garbage collection. Свойство сборщика мусора, описывающее это поведение, является неполным сборщиком. Другие коллекторы в значительной степени попадают в категорию под названием трассировочные сборщики мусора, которые включают в себя традиционные маркировочные, полупространственные/уплотняющие и гибридные генераторы и не страдают от этих недостатков (но сталкиваются с несколькими другими).
Все реализации JVM и CLI Я знаю об использовании полных коллекционеров, что означает, что они не страдают от конкретной проблемы, о которой вы просите здесь. Насколько мне известно, из них Jikes RVM является единственным, поставляющим опорный счетный коллектор (один из его многочисленных).
Еще одна интересная вещь, которую следует отметить, - это решение проблемы полноты в подсчете сбора мусора, а resulting collectors демонстрируют некоторые интересные характеристики производительности, которые трудно вывести из трассировочных коллекционеров. К сожалению, самые эффективные алгоритмы сбора мусора для подсчета ссылок и наиболее полнота модификаций зависят от помощи компилятора, поэтому приведение их в C++ shared_ptr<T>
сложно/не происходит. Вместо этого у нас есть weak_ptr<T>
и documented rules (извините за субоптимальную ссылку - видимо, документация ускользает от меня), просто избегая проблем. Это isn't the first time (другая посредственная ссылка), мы видели такой подход, и надеемся, что дополнительная работа по предотвращению проблем с памятью будет меньше объема работы, необходимой для поддержания кода, который не используется shared_ptr<T>
и т. Д.
посредственные ссылки связаны с тем, что большая часть моего справочного материала разбросана по нотам из класса управления памятью последнего семестра.
На самом деле, это одна из проблем со средами подсчета ссылок, которые ** позаботились о ** в .NET GC. –
Еще одна традиционная функция Lisp, проникающая в среднюю среду. –