Если вы используете PHP <5.3.0 и используете двусвязный список, ни один из узлов не будет освобожден. Это связано с тем, что в более ранних версиях PHP использовался только счетчик ссылок <a href="http://www.php.net/manual/en/features.gc.refcounting-basics.php" rel="nofollow"> [1] , который не может распознать циклические ссылки. Даже в односвязном списке возможно, что для освобождения всего списка потребуется 'n' проходов сборщика мусора, в зависимости от используемого алгоритма (хотя я вижу это маловероятным).
Для дальнейшего объяснения в двусвязном списке каждый узел указывает на узел как до, так и после него. Рассмотрим упорядоченные узлы A, B, C. Это означает, что A указывает на, B, C указывает на B, а B указывает на A и C. Поэтому их счетчик ссылок всегда будет ненулевым, если только Вы явно удаляете узлы самостоятельно.
С односвязным списком и одинаковыми узлами A, B, C каждый узел указывается предыдущим, кроме A, на который не указывает ни один другой узел. Поэтому, если вы удалите ссылку на A, это будет сбор мусора. Тогда, поскольку B больше не указан, он будет освобожден и так далее в списке. Однако, скажем, сборщик мусора посещает список в обратном или случайном порядке (а не в оптимальном порядке слева направо). Затем он может сначала взглянуть на B и сделать вывод, что A все еще указывает на него, и поэтому не нуждается в освобождении. Тогда GC освобождает и готово. Хотя более вероятно, что алгоритм GC непрерывно собирает память с нулевым счетчиком ссылок, пока больше нечего собирать, что позволило бы избежать этой проблемы.
К счастью, начиная с PHP 5.3.0 нам не нужно беспокоиться о циклических ссылках [2] . Этот алгоритм работает путем построения дерева из корневого узла памяти. Все, что не включено в окончательное дерево, должно быть осиротевшим (и, следовательно, поддерживается только из-за циклической ссылки), и поэтому может быть освобождено. Так что да, пока ничто в вашей программе не указывает на какой-либо узел в вашем списке, весь список будет освобожден путем удаления ссылок на начало и конец.
Обратите внимание, что алгоритм освобождения потерянных циклических ссылок дороже, чем простой подсчет ссылок. Явный код освобождения может быть или не быть полезным. Тщательный сравнительный анализ должен быть сделан, чтобы найти это.