История изменений
Исправление ilammy, (текущая версия) :
Вот я тоже над этим думал.
Можно пытаться отслеживать циклы при их создании, но это дорого выходит в общем случае.
Можно подсчёт ссылок снабдить неким трассирующим сборщиком, который проходит по куче время от времени и находит там брошенные циклы.
Но всё это упирается в одну маленькую проблему: если у объектов есть деструкторы/финализаторы/what-you-call-it, то в каком порядке их вызывать для объектов из цикла? При этом следует иметь в виду, что в деструкторах в принципе может находиться произвольный пользовательский код. Вот пара проблем, которые сразу приходят в голову. Может ли деструктор воскресить объект? Гарантирована ли корректность всех полей объекта, когда выполняется деструктор?
Первое-то решается особенным типом ссылки на удаляемый объект, внедрением деструкторов в сам язык и ограничением на код, который в них можно писать и вызывать. Но второе в общем случае решается только вручную расставляемыми слабыми ссылками (ну или «достаточно сообразительным ИИ»™, который их магическим образом расставит за программиста), которые как раз являются точками, где объект ссылается на потенциально уже умершие и финализированные объекты, и код деструктора готов к тому, что они пропали. Ну, или ещё дополнительными подпорочками, вроде того, что деструктор должен быть готов к тому, что любое поле в любой момент может взять и стать некорректным.
Исходная версия ilammy, :
Вот я тоже над этим думал.
Можно пытаться отслеживать циклы при их создании, но это дорого выходит в общем случае.
Можно подсчёт ссылок снабдить неким трассирующим сборщиком, который проходит по куче время от времени и находит там брошенные циклы.
Но всё это упирается в одну маленькую проблему: если у объектов есть деструкторы/финализаторы/what-you-call-it, то в каком порядке их вызывать для объектов из цикла? При этом следует иметь в виду, что в деструкторах в принципе может находиться произвольный пользовательский код. Вот пара проблем, которые сразу приходят в голову. Может ли деструктор воскресить объект? Гарантирована ли корректность всех полей объекта, когда выполняется деструктор?
Первое-то решается особенным типом ссылки на удаляемый объект, внедрением деструкторов в сам язык и ограничением на код, который в них можно писать и вызывать. Но второе в общем случае решается только вручную расставляемыми слабыми ссылками (ну или «достаточно сообразительным ИИ»™, который их магическим образом расставит за программиста), которые как раз являются точками, где объект ссылается на потенциально уже умершие и финализированные объекты, и код деструктора готов к тому, что они пропали.