Предотвращение циклических ссылок утечку памяти в Perl
Я недавно спросил вопрос о перезаписи объектов и управления памятью в Perl. Один из ответов, которые я получил, уведомил меня, что у меня может быть проблема со сценарием, который я недавно написал.
у меня есть скрипт с некоторыми очень сложными структурами данных, которые имеют много parent->child / child->parent
отношения. Это также означает, что существует много объектов, которые имеют циклические ссылки. Согласно ответ, циклические ссылки могут" обмануть " подсчет ссылок Perl механизм и причина утечки памяти, если они не рассматриваются должным образом.
пример циклической ссылки:
+-----------------------------------------------------+
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
$parent -->+============+ [ Hash ] |
[ ] +==========+ |
[ children --->[ Array ] |
[ ] [ ] |
+==========+ [ 0: ---------+ |
[ ] | |
+==========+ | |
| |
+--------------------------------------------------+ |
| |
+-->+============+ +==========+ |
[ Reference ----->[ Blessed ] |
$child --->+============+ [ Hash ] |
[ ] |
[ parent: ----------------------+
[ ]
+==========+
(отказ от ответственности -- это не мое эпическое произведение -- спасибо @Ikegami за эту сладкую диаграмму ASCII!)
: каждый объект имеет ссылку на другой . . . это значит, что однажды $parent
и $child
выйти из области, счетчик ссылок Perl по-прежнему считает, что ссылка на каждый объект существует, поэтому память никогда не освобождается. Вы заканчиваете с двумя объектами в памяти без возможности доступа к данным любого из них!
мой вопрос: Как правильно обращаться с циклическими ссылками, чтобы гарантировать, что Perl обрабатывает его очистку должным образом? Как вы убедитесь, что Perl не оставляет никаких фрагментов, когда все внешние ссылки на самореферентный объект устранены?