Предотвращение циклических ссылок утечку памяти в 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 не оставляет никаких фрагментов, когда все внешние ссылки на самореферентный объект устранены?

1 ответов


Scalar::Util и в частности