Отменяет ли массив объектов объекты только массив или все объекты? - PullRequest
3 голосов
/ 22 января 2010

У меня есть массив объектов. Если я вызову unset ($ array), будут ли отменены все объекты в массиве и массиве или только массиве? Давайте предположим, что на эти объекты больше нигде нет ссылок.

Ответы [ 3 ]

2 голосов
/ 22 января 2010

Если этот массив содержит единственную ссылку на объект, тогда да. В противном случае нет. Кроме того, кое-что следует иметь в виду из документации PHP:

unset () делает то, что говорит его имя - сбросить переменную. Это не вызывает немедленного освобождения памяти. РНР сборщик мусора сделает это когда смотреть подходит - намеренно, как только эти циклы процессора не нужны, или еще раньше сценарий не хватает памяти, что бы ни происходило первый.

1 голос
/ 22 января 2010

GSto is right ... Только сборщик PHP-файлов может освободить память. unset () переменная или установка ее в NULL может ускорить процесс «сбора garbadge» (по цене циклов ЦП), но нет никакого способа непосредственно освободить часть памяти (в C ++, где «delete» фактически освобождает память) .

Я задал похожий вопрос некоторое время назад на форуме, и вот что я получил:

От Фу-Лу @ codingforums.com:

Unset free - это его ресурсы и любые бесплатный запрос делает то же самое (как mysql_free_result). Да, это позволяет коллекционер, чтобы позаботиться об этом. Но пока процесс сбора не происходит, он будет игнорировать любые ссылки переменные. Так что, если проход GC видит, что ссылка на переменную буду игнорировать это. Если он видит, что имеет был освобожден, он возьмет это, но если у вас есть блок данных, который не освобожден и не используется, чем он будет сидеть в память до завершения скрипта (меньше актуален в наше время на современном высоком баране системы). Использование unset для массива достаточно для gc, чтобы взять это. Больной посмотрим, смогу ли я найти его в источнике, но я бы предположил, что все HashMaps используется ссылочными указателями C и не ценности, поэтому сами ценности не имеют никакого отношения к нулю указатель в любом случае одинакового размера. Я бы также подозреваю, что когда-то GC добирается до хэш-карта, через которую он пройдет и освободить каждый звал, связанный с он и будет выполнять запись на копию для любой отдельный указатель, связанный с конкретная переменная (причудливый способ говоря, что это не выпустит никакого индекса на что ссылается другой переменная).

http://www.codingforums.com/showthread.php?t=184164

0 голосов
/ 22 января 2010

Похоже, что память не освобождается, пока ваш скрипт не завершит выполнение. http://bugs.php.net/bug.php?id=48368

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