Порядок уничтожения объектов гарбедж коллектором в PHP5 по окончанию работы скрипта.

Screjet

Новичок
Аха. Сорри за невнимательность.
Можно объяснить, это связано с пулом памяти Зенд и механизмом операции "=":
...
Создается новый объект #4,
все элементы пула 1-3 заняты,
#2 освобождается (оставляя свободный сегмент памяти пула)
Создается новый объект(#5), который "вмещается" в сегмент пула #2.
В итоге на место #2 становится #5.

При добавлении к твоему коду банального unset($a) все работает так как ожидается (т.е. уничтожение в прямой последовательности массива).
При добавлении unset($a[1]) перед $a[1] = так же работает как ожидается соответственно.

-~{}~ 11.03.05 22:03:

Да, забыл добавить: а по окончанию работы скрипта зенд просто освобождает все подряд.
 

Blindman

Новичок
Да, в общем, так это и работает, но деструкторы вызываются ДО уничтожения глобальных переменных. Одна из причин в том, что в деструкторе может быть обращение к уничтоженным переменным (например, $GLOBALS), и это вызовет крэш.
 

Screjet

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

Blindman

Новичок
Краха не будет по любому
Крах ВОЗМОЖЕН, если вызывать деструкторы в процессе уничтожения глобальных переменных при завершении работы работы скрипта. Это неоднократно обсуждалось в php-internals

-~{}~ 13.03.05 15:00:

Anton
Гарантировать порядок вызова деструкторов для глобальных объектов можно только, если явно уничтожать их при завершении работы скрипта.
Если деструктор объекта B должен быть вызван после деструктора объекта A, то объект A должен содержать ссылку на объект B, при этом порядок вызова деструкторов будет гарантирован независимо от порядка уничтожения переменных.
 
Сверху