Управление памятью Python - PullRequest
2 голосов
/ 21 марта 2012

Скажем, у меня есть двоичное дерево, которое содержит указатели на каждом узле, идущем к родительскому и дочернему элементам, и я хочу удалить некоторую часть внутреннего поддерева, исправляя оставшуюся часть дерева разумным образом.

Знает ли Python, что нужно собирать отброшенный кусок поддерева, даже если узлы внутри ссылаются друг на друга? Я ожидаю, что это будет возможность всех языков, которые используют сборщик мусора, но я не знаю достаточно о сборке мусора, чтобы знать наверняка. Лучшее, что я сделал сам, - это умная (C ++) система указателей, которая не была достаточно умна, чтобы справиться со случаем, который я описал выше.

1 Ответ

1 голос
/ 21 марта 2012

Да, Python отбрасывает узлы без ссылок в дереве.

CPython использует подсчет ссылок для выполнения большей части сбора мусора. В вашем случае у одного или нескольких узлов дерева не останется ссылок, поэтому они будут освобождены. Тогда узлы, на которые указывал освобожденный узел, могут не иметь ссылок, и они тоже будут освобождены. Все рекурсивные узлы будут рекурсивно освобождены.

CPython также имеет сборщик мусора, который может собирать не связанные циклы . Их нельзя (легко) обнаружить с помощью подсчета ссылок, но сборщик циклов может их идентифицировать и освободить.

Другие реализации Python, такие как IronPython или Jython, используют разные схемы сборщика мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...