Обычная ссылка предотвращает сбор мусора. Слабая ссылка похожа на нормальную ссылку, но не мешает сборке мусора. Когда удаляется последняя нормальная ссылка на сущность, она собирает мусор, и любые слабые ссылки на нее становятся undef
.
Это полезно, если у вас есть круговые ссылки. Сборщик мусора с подсчетом ссылок (как в Perl) не может удалить объекты с циклическими ссылками, потому что их счетчик ссылок никогда не будет равен 0.
Например, рассмотрим древовидную структуру, где родительские узлы имеют ссылки на свои дочерние узлы, а дочерние узлы имеют ссылку на своих родительских. Сделав слабые дочерние ссылки, дерево будет автоматически собирать мусор, когда на него нет внешних ссылок.
В Perl слабые ссылки могут быть созданы с помощью функции weaken
в Scalar :: Util . Moose также позволяет помечать атрибуты как weak_ref .